Закрытие резьбового окна Tkinter - PullRequest
1 голос
/ 10 августа 2011

Я использую окно Tkinter, чтобы визуализировать некоторые результаты моей программы. Окно имеет резьбу (см. Базовую структуру ниже) и в основном работает довольно хорошо. Пока у меня только проблемы с закрытием окна. Когда я нажимаю кнопку «X», чтобы закрыть окно, оно работает.

Однако, когда я вызываю метод Monitor.close () из основной программы, которая запускает поток монитора, окно просто зависает (например, не реагирует на нажатие кнопки «X»), и монитор потока сохраняет Бег. Таким образом, основная программа не выходит.

Итак, на данный момент я также должен сначала закрыть окно «вручную», нажав кнопку закрытия, а затем основную программу. Не большая проблема, но было бы здорово, если бы основная программа могла сама закрывать окно. Есть намеки?

Спасибо и всего наилучшего,

Christian

class Monitor(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.start()

    def close(self):
        self.root.quit()
        self.root.destroy()

    def run(self):
        self.root=Tkinter.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.close)
        self.root.mainloop()

1 Ответ

2 голосов
/ 10 августа 2011

Python Threading и Tk (inter), используемые таким образом, не очень хорошо сочетаются, поскольку они нарушают модель потоков Tcl / Tk с использованием Tk только из одного потока.

Хотя он прекрасно работает с передачей сообщений,просто не с прямыми звонками из потока.Поэтому вам нужно добавить к этому сообщение, проходящее через очередь.

Посмотрите на пример http://effbot.org/zone/tkinter-threads.htm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...