Python Tkinter близко к остановке цикла - PullRequest
0 голосов
/ 14 марта 2019

python3.5

Мне нужен графический интерфейс и поток для обработки тяжелых вычислений. поток выводит некоторую информацию о состоянии, зависит от результата вычисления. Теперь я попробую приведенный ниже код, кажется, работает нормально. но когда я нажимаю кнопку закрытия (x) окна, графический интерфейс зависает.

import tkinter as tk
import threading
import time
import tkinter.scrolledtext as scrolledtext

class GUI:
    def __init__(self, master):
        self.master = master
        self.scrolledtext = scrolledtext.ScrolledText()
        self.scrolledtext['font'] = ('consolas', '12')
        self.scrolledtext.pack(expand=True, fill='both')
        self.scrolledtext.insert(tk.END, "test\n")
        self.master.protocol("WM_DELETE_WINDOW", self.closeme)

        self.threadTask = ThreadedTask(self.scrolledtext)
        self.threadTask.start()

    def closeme(self):
        self.threadTask.stop()
        self.threadTask.join()
        self.master.destroy()

class ThreadedTask(threading.Thread):
    def __init__(self,scrolledtext):
        threading.Thread.__init__(self)
        self.scrolledtext = scrolledtext
        self._stop_event = threading.Event()

    def stop(self):
        self._stop_event.set()

    def run(self):
        while(not self._stop_event.is_set()):
            time.sleep(1)
            # to do: something heavy computation....
            self.scrolledtext.insert(tk.END, "123\n")
            self._stop_event.wait(1)


root = tk.Tk()
root.title("Test")
main_ui = GUI(root)
root.mainloop()

1 Ответ

0 голосов
/ 17 марта 2019

Я изменил функцию закрытия.Попробуйте сейчас, на моем Debian это работает.

 def closeme(self):

        if self.threadTask.is_alive():
            self.scrolledtext.insert(tk.END, "I', stopping\npress close again")
            self.threadTask.stop()
            #self.threadTask.join()
        else:
            self.master.destroy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...