Я создаю простой пользовательский интерфейс Python через Tkinter, и я хотел бы использовать self.title
для изменения заголовка окна при генерировании события обратного вызова.
Если я привяжу событие к кнопке или вызову обработчик события непосредственно в потоке Tk, заголовок окна изменится, как и ожидалось. Однако я намереваюсь вызвать это событие отдельным потоком, и обнаружил, что использование title
в обработчике события обратного вызова приводит к зависанию приложения.
Другие задачи, которые у меня есть в обработчике событий (например, обновление метки), работают нормально, поэтому я должен предположить, что событие вызывается правильно. Я пробовал wm_title
вместо title
, но не увидел разницы. Я покопался и не нашел ничего странного в использовании title
, просто назовите его со строкой, чтобы установить заголовок.
Вот урезанный пример, который повторяет проблему (я использую v2.7.1 на WinXP FYI); приложение работает нормально в течение 10 секунд (может переместить окно, изменить размер и т. д.), после чего Timer
генерирует событие, а затем приложение останавливается.
import Tkinter
import threading
class Gui(Tkinter.Tk):
def __init__(self, parent=None):
Tkinter.Tk.__init__(self, parent)
self.title('Original Title')
self.label = Tkinter.Label(self, text='Just a Label.',
width=30, anchor='center')
self.label.grid()
self.bind('<<change_title>>', self.change_title)
timer = threading.Timer(10, self.event_generate, ['<<change_title>>'])
timer.start()
def change_title(self, event=None):
self.title('New Title')
G = Gui(None)
G.mainloop()