繁体   English   中英

Tkinter window 说(无响应)但代码正在运行

[英]Tkinter window says (not responding) but code is running

单击操作按钮后,我有一个程序会运行很长时间。 当进程运行时,root window 会说它没有响应,即使我知道该程序正在后台运行。 该程序将发布给与我一起工作的几个人,我想确保他们在看到此程序时不会惊慌失措并关闭 window。 我的解决方案是在正在运行的进程的循环中设置一个 root.update,但我不确定这是最好的解决方法。

使用 python 3.3

这是代码示例,因此您可以了解我在做什么,这是从主循环调用的:

def combine(boxes_to, boxes_from, frame):
        to_value,to_pos = gui.checkBoxes(boxes_to)
        from_value,from_pos = gui.checkBoxes(boxes_from)
        frame.destroy()

        running = Label(root,text="Running please do not close..",font = (16))
        running.pack()
        root.update()
        map_to = open("map_to",'r')
        for line in map_to:
            root.update()
            process(line)


        running.destroy()
        map_to.close()
        finish = Button(root, text="Done",command=gui.stop)
        finish.pack()

您在这里可以做的最好的事情是在 Python 中使用多线程。以下是如何做到这一点:

假设您有一个名为combine()的 function,因此 window 被冻结,它被用作名为“btn”的按钮的命令,如下所示:

btn = Button(root, text="Click Me", command=combine)

现在,当按下btn时,您可能会遇到“无响应”问题。 要解决此问题,请按如下所示编辑代码:

import threading
btn = Button(root, text="Click Me", command=threading.Thread(target=combine).start)

这里threading.Thread创建了一个单独的线程,其中执行combine()方法,因此 GUI 可以在执行命令的同时继续保持响应。

虽然您可以在循环中调用root.update(),但这仍然会产生一些(可能)不良副作用。

  1. 该程序可能会滞后,这意味着需要很长时间来响应用户输入。
  2. 您只能运行此操作。 任何其他行动都必须等待此操作完成。

作为替代方案,我建议您实现简单的多线程。 Python多线程非常简单,并且可以防止这两个缺点。 您将能够执行长时间运行的代码,同时仍然提供干净且响应迅速的UI。

如果您的应用程序可以简单地并行化,则可以使用多个线程来减少运行时间。 防爆。 线程1处理条目1-100,而线程2处理条目101-200。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM