【问题标题】:Function execution freezes GUI despite using Threads尽管使用了线程,但函数执行冻结了 GUI
【发布时间】:2018-10-05 08:58:17
【问题描述】:

我有一个用 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 次“IN THREAD”,而进度条应该在 GUI 周围反弹。

但这不起作用:谁能指出我正在犯的错误?我的想法不多了。

【问题讨论】:

    标签: python python-3.x multithreading tkinter


    【解决方案1】:

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

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

    【讨论】:

    • 好的,我明白了,但是我应该在哪里调用 run() 函数呢?在star() 函数内部?它仍然工作相同。能否提供一些示例代码?
    • 如果你调用start()函数,你继承的线程类将启动一个(操作系统)线程来运行run()函数。您永远不会自己调用 run() 函数。
    猜你喜欢
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多