19

我有一个程序在您单击操作按钮后运行很长的过程。当进程正在运行时,即使我知道程序正在后台运行,根窗口也会说它没有响应。这个程序将发布给与我一起工作的几个人,我想确保他们在看到这个时不会惊慌失措并关闭窗口。我的解决方案是将 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()
4

2 回答 2

14

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

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

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

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

于 2013-08-29T23:04:03.650 回答
4

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

  1. 假设您有一个名为的函数combine(),由于该函数窗口冻结
  2. 它被用作名为“btn”的按钮的命令,如下所示:
btn = Button(root, text="Click Me",command=combine)
  1. 现在,当按下 btn 时,您可能会遇到“无响应”问题。为此编辑代码,如下所示:
import threading
btn = Button(root,text="Click Me", command=threading.Thread(target=combine).start())
  1. 这里 threading.Thread 充当Multithreading,它被定义为处理器同时执行多个线程/函数的能力。
于 2021-08-23T17:55:25.193 回答