【问题标题】:Tkinter window says (not responding) but code is runningTkinter 窗口显示(无响应)但代码正在运行
【发布时间】:2013-09-02 13:11:20
【问题描述】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 请注意:从不同线程访问tkinter 小部件/变量是不好的做法。有时tkinter 可能会在没有错误消息的情况下崩溃。只有tkinter 的某些部分是线程安全的。
【解决方案2】:

您可以在这里做的最好的事情是在 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充当多线程,定义为处理器同时执行多个线程/函数的能力。

【讨论】:

  • 如果您的函数在打开应用时正在运行且未单击按钮,请尝试从 .start() 中删除 ()
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多