Выполнение функции останавливает графический интерфейс, несмотря на использование потоков - PullRequest
0 голосов
/ 05 октября 2018

У меня очень простой графический интерфейс, созданный с помощью tkinter, который содержит индикатор выполнения, который должен отображать активность программы во время длительной функции обработки.Как я понимаю, я должен использовать потоки, так как tkinter является однопоточным, поэтому я написал следующий код:

def start(self):
    self.root.progressbar.start(interval=5)
    try:
        path = tk.filedialog.asksaveasfilename(initialfile='log.txt', filetypes=[("Text file", "*.txt")],
                                               initialdir='~/Desktop')
        if path:
            filtering_thread = FilteringThread(self.comparator)
            filtering_thread.run()
            self.root.progressbar.stop()
            self.comparator.log_matches(path)
        else:
            messagebox.showinfo("Error", "Choose path to save result.")

    except FileNotFoundError as e:
        messagebox.showinfo("Error", str(e))

А вот моя реализация FilteringThread:

class FilteringThread(Thread):

    def __init__(self, comparator):
        Thread.__init__(self)
        self.comparator = comparator

    def run(self):
        import time
        for _ in range(5):
            time.sleep(1)
            print("IN THREAD")

На данный момент это просто имитируетповедение реальной функции, но идея остается прежней.Я должен видеть в консоли, что он печатает «IN THREAD» 5 раз, в то время как индикатор выполнения должен подпрыгивать вокруг GUI.

Но это не работает: кто-нибудь может указать мне на ошибку, которую я делаю?У меня заканчиваются идеи.

1 Ответ

0 голосов
/ 05 октября 2018

Вы вызываете filtering_thread.run() в своей функции, таким образом вызывая функцию run() вашего объекта потока в текущем потоке .Вот почему у вас нет ничего в вашей программе.

Вместо этого вам нужно вызвать filtering_thread.start().Это немедленно вернется, но запустит новый поток, который затем выполнит функцию run() объекта потока.

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