在此示例中,按下按钮时 GUI 冻结,因为主线程正在等待让 Thread(target = self.threaded_function) 创建的线程在继续之前完成。为了保持 GUI 的响应能力,避免阻塞主线程非常重要。
这里有一个替代实现,它使用队列在线程和 GUI 之间传递数据:
queue = Queue() def threaded_function(): while True: if not queue.empty(): item = queue.get() print(item) # Do other processing here def helloCallback(): queue.put("asd") m = magic() B = tkinter.Button(top, text = "Hello", command = helloCallback) B.pack() top.mainloop() # Start the thread in the background t = threading.Thread(target = threaded_function) t.start()
在此实现后,GUI 线程继续响应,而 threaded_function 在后台运行。队列用于在两个线程之间传递数据。当调用 helloCallback 函数时,它会向队列添加一个项目,然后由 threaded_function 检索并处理该项目。
以上是如何防止 Tkinter GUI 在等待线程完成时冻结?的详细内容。更多信息请关注PHP中文网其他相关文章!