尽管使用线程,函数执行仍会冻结 GUI



我有一个非常简单的GUI,使用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 周围反弹。

但它不起作用:谁能指出我犯的错误?我的想法快用完了。

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

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

最新更新