Python 函数执行冻结GUI,尽管使用了线程

Python 函数执行冻结GUI,尽管使用了线程,python,python-3.x,multithreading,tkinter,Python,Python 3.x,Multithreading,Tkinter,我用tkinter构建了一个非常简单的GUI,它包含一个进度条,在长时间的处理过程中应该显示程序的活动。据我所知,我必须使用线程,因为tkinter是单线程的,所以我编写了以下代码: def start(self): self.root.progressbar.start(interval=5) try: path = tk.filedialog.asksaveasfilename(initialfile='log.txt', filetypes=[("Text

我用tkinter构建了一个非常简单的GUI,它包含一个进度条,在长时间的处理过程中应该显示程序的活动。据我所知,我必须使用线程,因为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")
就目前而言,它只是模仿真实函数的行为,但其思想保持不变。我应该在控制台中看到,它在线程中打印了5次,而进度条应该在GUI中反弹


但它不起作用:有人能指出我犯的错误吗?我没有主意了。

在函数中调用
筛选线程。run()
,从而在当前线程中调用线程对象的
run()
函数。这就是为什么程序中没有任何线程


相反,您需要调用
筛选\u thread.start()
。这将立即返回,但将启动一个新线程,然后该线程将执行thread对象的
run()
函数。

好的,我知道了,但是我应该在哪里调用run()函数呢?内星形()函数?它仍然起作用。能否提供一些示例代码?如果调用
start()
函数,您继承的线程类将启动一个(操作系统)线程,该线程将运行
run()
函数。您从不自己调用
run()
函数。