Tkinter app i18n _tkinter.TclError: неверное имя команды «.!text» после уничтожения ⇐ Python
-
Гость
Tkinter app i18n _tkinter.TclError: неверное имя команды «.!text» после уничтожения
Я создавал приложение с помощью tkinter, и большинство функций оно работает. он содержит две рамки: одну для функциональной области ноутбука, другую для области журнала. на вкладке записной книжки есть список переключателей языков. Мне пришлось уничтожить все фреймы и воссоздать их после изменения языка
импорт журнала, os импортировать tkinter как tk из tkinter import OptionMenu, filedialog, ttk импортировать tkinter.scrolledtext как ScrolledText logging.basicConfig(filename='test.log', уровень = ведение журнала.DEBUG, format='%(asctime)s - %(имя уровня)s - %(сообщение)s') # Добавляем обработчик в логгер регистратор = logging.getLogger() класс TextHandler(logging.Handler): # Этот класс позволяет вам войти в виджет Tkinter Text или ScrolledText. # Адаптировано из Моше Каплана: https://gist.github.com/moshekaplan/c42 ... 7bbf28ef06 def __init__(self, текст): # запускаем обычный обработчик __init__ logging.Handler.__init__(self) # Сохраняем ссылку на текст, в который он будет записываться self.text = текст self.max_length = 250 Защиту излучать (сам, запись): сообщение = self.format(запись) если len(msg) > self.max_length: линии = [] в то время как len(msg) > self.max_length: lines.append(msg[:self.max_length]) сообщение = сообщение[self.max_length:] линии.append(сообщение) msg= '\n'.join(lines) защита добавления(): self.text.configure(state='normal') self.text.insert(tk.END, msg + '\n') self.text.configure(state='disabled') # Автопрокрутка вниз self.text.yview(tk.END) # Это необходимо, поскольку мы не можем изменять текст из других потоков self.text.after(0, добавить) Защиту docView (frame, ttkframe, lang): Sociallang = tk.StringVar() l_lang = tk.Label(ttkframe, text='display lang') # l_lang.place(x=10, y=90) l_lang.grid(строка = 3, столбец = 0, диапазон столбцов = 3, Padx = 14, Pady = 15) Keeplang = Sociallang.get() box = ttk.Combobox(ttkframe, textvariable=keeplang, state='readonly') # box.place(x=10, y=120) box.grid(строка = 4, столбец = 1, диапазон столбцов = 3, Padx = 14, Pady = 15) защита выбранного языка (событие): поле = событие.виджет print('выбранный язык:',box.get()) изменениеDisplayLang(box.get()) box['values'] = ('en', 'zh') коробка.текущий(0) box.bind("", selectedlang) def render(root,window,log_frame,lang): глобальный doc_frame tab_control = ttk.Notebook(окно) doc_frame = ttk.Frame(tab_control) doc_frame.grid_rowconfigure(0, вес=1) doc_frame.grid_columnconfigure(0, вес=1, униформа="группа1") doc_frame.grid_columnconfigure(1, вес=1, униформа="группа1") doc_frame.columnconfigure((0,1), вес=1) doc_frame_left = tk.Frame(doc_frame) doc_frame_left.grid(row=0,column=0,sticky="nsew") doc_frame_right = tk.Frame(doc_frame) doc_frame_right.grid(row=0,column=1,sticky="nsew") если lang=='en': печать('1111') tab_control.add(doc_frame, text='help') еще: tab_control.add(doc_frame, text='帮助') печать('222') docView(doc_frame_left,doc_frame_right,lang) account_frame = ttk.Frame(tab_control) account_frame.grid_rowconfigure(0, вес=1) account_frame.grid_columnconfigure(0, вес=1, униформа="группа1") account_frame.grid_columnconfigure(1, вес=1, униформа="группа1") account_frame.columnconfigure((0,1), вес=1) account_frame_left = tk.Frame (account_frame, высота = 240) account_frame_left.grid(row=0,column=0,sticky="nsew") account_frame_right = tk.Frame (account_frame, высота = 240) account_frame_right.grid(row=0,column=1,sticky="nsew") tab_control.add(account_frame, text='demo') docView(account_frame_right,account_frame_left,lang) # tab_control.pack(expand=1, fill='both') tab_control.grid(строка=0,столбец=0) определение начала (язык): глобальный ROOT_DIR ROOT_DIR = os.path.dirname( os.path.abspath(__file__) ) глобальный корень,paned_window,log_frame,mainwindow,st # root.resizable(ширина=True, высота=True) root.iconbitmap("активы/icon.ico") # Создайте виджет PanedWindow (вертикальный) paned_window = tk.PanedWindow(root, orient=tk.VERTICAL) paned_window.pack(expand=True, fill="both") # Настраиваем веса для mainwindow и log_frame paned_window.grid_rowconfigure(0, вес=5) paned_window.grid_rowconfigure(1, вес=1) # Создаем рамку для блокнота основное окно = ttk.Frame(paned_window) paned_window.add(главное окно) mainwindow.grid_rowconfigure(0, вес = 1) mainwindow.grid_columnconfigure(0, вес = 1) log_frame =tk.Frame(paned_window) paned_window.add(log_frame) log_frame.grid_rowconfigure(0, вес = 1) log_frame.grid_columnconfigure (0, вес = 1) log_frame.columnconfigure(0, вес=1) log_frame.rowconfigure(0, вес=1) st = ScrolledText.ScrolledText(log_frame, # ширина = ширина, # высота = 5, состояние = 'отключено') st.configure(font='TkFixedFont') st.grid(столбец=0, строка=0, липкий = 'nwse', # диапазон столбцов = 4 ) глобальный text_handler text_handler = TextHandler(ст) logger.addHandler(text_handler) рендеринг (корень, главное окно, log_frame, язык) root.update_idletasks() # # Установите начальный размер рамки ноутбука (4/5 общей высоты) mainwindow_initial_percentage = 5/6 # Рассчитать начальную высоту главного окна на основе процента Initial_height = int(float(root.winfo_height()) * mainwindow_initial_percentage) mainwindow.config(высота=начальная_высота) защита ChangeDisplayLang (язык): основное окно.уничтожить() ул.уничтожить() log_frame.destroy() paned_window.destroy() # root.quit() #дель text_handler начало (язык) logger.info(f'переключить язык на локаль:{lang}') корень.mainloop() если __name__ == '__main__': глобальный корень корень = тк.Тк() начать('эн') корень.mainloop() Я хочу выбрать язык и обновить все приложение, это работает, но дайте мне
Исключение в обратном вызове Tkinter Traceback (последний вызов последний): Файл "/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py", строка 1892, в __call__ вернуть self.func(*args) Файл "/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py", строка 814, в callit функция(*аргументы) Файл «/Users/wenke/github/app/t.py», строка 40, в приложении. self.text.configure(state='normal') Файл "/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py", строка 1646, в настройке return self._configure('configure', cnf, kw) Файл «/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py», строка 1636, в _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) _tkinter.TclError: неверное имя команды ".!panedwindow4.!frame2.!frame.!scrolledtext
Я создавал приложение с помощью tkinter, и большинство функций оно работает. он содержит две рамки: одну для функциональной области ноутбука, другую для области журнала. на вкладке записной книжки есть список переключателей языков. Мне пришлось уничтожить все фреймы и воссоздать их после изменения языка
импорт журнала, os импортировать tkinter как tk из tkinter import OptionMenu, filedialog, ttk импортировать tkinter.scrolledtext как ScrolledText logging.basicConfig(filename='test.log', уровень = ведение журнала.DEBUG, format='%(asctime)s - %(имя уровня)s - %(сообщение)s') # Добавляем обработчик в логгер регистратор = logging.getLogger() класс TextHandler(logging.Handler): # Этот класс позволяет вам войти в виджет Tkinter Text или ScrolledText. # Адаптировано из Моше Каплана: https://gist.github.com/moshekaplan/c42 ... 7bbf28ef06 def __init__(self, текст): # запускаем обычный обработчик __init__ logging.Handler.__init__(self) # Сохраняем ссылку на текст, в который он будет записываться self.text = текст self.max_length = 250 Защиту излучать (сам, запись): сообщение = self.format(запись) если len(msg) > self.max_length: линии = [] в то время как len(msg) > self.max_length: lines.append(msg[:self.max_length]) сообщение = сообщение[self.max_length:] линии.append(сообщение) msg= '\n'.join(lines) защита добавления(): self.text.configure(state='normal') self.text.insert(tk.END, msg + '\n') self.text.configure(state='disabled') # Автопрокрутка вниз self.text.yview(tk.END) # Это необходимо, поскольку мы не можем изменять текст из других потоков self.text.after(0, добавить) Защиту docView (frame, ttkframe, lang): Sociallang = tk.StringVar() l_lang = tk.Label(ttkframe, text='display lang') # l_lang.place(x=10, y=90) l_lang.grid(строка = 3, столбец = 0, диапазон столбцов = 3, Padx = 14, Pady = 15) Keeplang = Sociallang.get() box = ttk.Combobox(ttkframe, textvariable=keeplang, state='readonly') # box.place(x=10, y=120) box.grid(строка = 4, столбец = 1, диапазон столбцов = 3, Padx = 14, Pady = 15) защита выбранного языка (событие): поле = событие.виджет print('выбранный язык:',box.get()) изменениеDisplayLang(box.get()) box['values'] = ('en', 'zh') коробка.текущий(0) box.bind("", selectedlang) def render(root,window,log_frame,lang): глобальный doc_frame tab_control = ttk.Notebook(окно) doc_frame = ttk.Frame(tab_control) doc_frame.grid_rowconfigure(0, вес=1) doc_frame.grid_columnconfigure(0, вес=1, униформа="группа1") doc_frame.grid_columnconfigure(1, вес=1, униформа="группа1") doc_frame.columnconfigure((0,1), вес=1) doc_frame_left = tk.Frame(doc_frame) doc_frame_left.grid(row=0,column=0,sticky="nsew") doc_frame_right = tk.Frame(doc_frame) doc_frame_right.grid(row=0,column=1,sticky="nsew") если lang=='en': печать('1111') tab_control.add(doc_frame, text='help') еще: tab_control.add(doc_frame, text='帮助') печать('222') docView(doc_frame_left,doc_frame_right,lang) account_frame = ttk.Frame(tab_control) account_frame.grid_rowconfigure(0, вес=1) account_frame.grid_columnconfigure(0, вес=1, униформа="группа1") account_frame.grid_columnconfigure(1, вес=1, униформа="группа1") account_frame.columnconfigure((0,1), вес=1) account_frame_left = tk.Frame (account_frame, высота = 240) account_frame_left.grid(row=0,column=0,sticky="nsew") account_frame_right = tk.Frame (account_frame, высота = 240) account_frame_right.grid(row=0,column=1,sticky="nsew") tab_control.add(account_frame, text='demo') docView(account_frame_right,account_frame_left,lang) # tab_control.pack(expand=1, fill='both') tab_control.grid(строка=0,столбец=0) определение начала (язык): глобальный ROOT_DIR ROOT_DIR = os.path.dirname( os.path.abspath(__file__) ) глобальный корень,paned_window,log_frame,mainwindow,st # root.resizable(ширина=True, высота=True) root.iconbitmap("активы/icon.ico") # Создайте виджет PanedWindow (вертикальный) paned_window = tk.PanedWindow(root, orient=tk.VERTICAL) paned_window.pack(expand=True, fill="both") # Настраиваем веса для mainwindow и log_frame paned_window.grid_rowconfigure(0, вес=5) paned_window.grid_rowconfigure(1, вес=1) # Создаем рамку для блокнота основное окно = ttk.Frame(paned_window) paned_window.add(главное окно) mainwindow.grid_rowconfigure(0, вес = 1) mainwindow.grid_columnconfigure(0, вес = 1) log_frame =tk.Frame(paned_window) paned_window.add(log_frame) log_frame.grid_rowconfigure(0, вес = 1) log_frame.grid_columnconfigure (0, вес = 1) log_frame.columnconfigure(0, вес=1) log_frame.rowconfigure(0, вес=1) st = ScrolledText.ScrolledText(log_frame, # ширина = ширина, # высота = 5, состояние = 'отключено') st.configure(font='TkFixedFont') st.grid(столбец=0, строка=0, липкий = 'nwse', # диапазон столбцов = 4 ) глобальный text_handler text_handler = TextHandler(ст) logger.addHandler(text_handler) рендеринг (корень, главное окно, log_frame, язык) root.update_idletasks() # # Установите начальный размер рамки ноутбука (4/5 общей высоты) mainwindow_initial_percentage = 5/6 # Рассчитать начальную высоту главного окна на основе процента Initial_height = int(float(root.winfo_height()) * mainwindow_initial_percentage) mainwindow.config(высота=начальная_высота) защита ChangeDisplayLang (язык): основное окно.уничтожить() ул.уничтожить() log_frame.destroy() paned_window.destroy() # root.quit() #дель text_handler начало (язык) logger.info(f'переключить язык на локаль:{lang}') корень.mainloop() если __name__ == '__main__': глобальный корень корень = тк.Тк() начать('эн') корень.mainloop() Я хочу выбрать язык и обновить все приложение, это работает, но дайте мне
Исключение в обратном вызове Tkinter Traceback (последний вызов последний): Файл "/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py", строка 1892, в __call__ вернуть self.func(*args) Файл "/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py", строка 814, в callit функция(*аргументы) Файл «/Users/wenke/github/app/t.py», строка 40, в приложении. self.text.configure(state='normal') Файл "/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py", строка 1646, в настройке return self._configure('configure', cnf, kw) Файл «/Users/wenke/miniconda3/lib/python3.9/tkinter/__init__.py», строка 1636, в _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) _tkinter.TclError: неверное имя команды ".!panedwindow4.!frame2.!frame.!scrolledtext