当前位置: 首页 > 知识库问答 >
问题:

Tkinter窗口显示(未响应),但代码正在运行

东方辉
2023-03-14

我有一个程序,在你点击一个动作按钮后,它会运行一个很长的过程。当进程正在运行时,根窗口会说它没有响应,即使我知道程序正在后台运行。这个程序将发布给我的几个同事,我想确保他们看到这个时不会惊慌失措并关闭窗口。我的解决办法是坐在树根上。正在运行的进程的循环中进行更新,但我不确定这是否是最佳修复方法。

使用Python3.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()

共有2个答案

沈华皓
2023-03-14
  1. 假设你有一个函数,名为联合(),由于这个函数,窗口正在冻结
  2. 它被用作名为btn的按钮的命令,如下所示:
btn = Button(root, text="Click Me",command=combine)
import threading
btn = Button(root,text="Click Me", command=threading.Thread(target=combine).start())
寿伟
2023-03-14

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

  1. 程序可能会表现出滞后,这意味着响应用户输入需要很长时间

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

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

 类似资料:
  • 我正在运行基于这里所示示例的代码,在OS X上使用Eclipse,我正在使用JFreeChart和JCommon库。 正如我在标题中所说,程序正在运行,但没有显示任何内容。作为检查,我尝试使用printData()方法打印数据,它工作得非常好。它正确地从yahoo csv文件中获取数据。 我甚至尝试过使用一小部分数据(20行),但它一直不显示。 问题可能只是在显示JFrame窗口时。 我插入的试图

  • 当我运行我的pyplay程序的游戏窗口显示没有反应,我也写了退出功能,但我不知道为什么它再次广告再次显示没有反应,我的笔记本电脑是Windows 8和32位

  • 问题内容: 我正在尝试通过py2exe创建一个exe。该程序正在使用Tkinter显示类似弹出窗口的窗口。问题是,当我像这样运行安装程序时,一切正常: 但是当我尝试制作一个文件的exe时失败: 实际上,最终exe可以正常运行,但是不会显示任何窗口。我已经阅读过Windows 7上的bundle_files = 1可能存在问题,但我也尝试了bundle_files = 2来达到同样的效果。这是我的m

  • 我有一个docker容器,它可以打开一个tkinter窗口,但它一直崩溃,因为它无法连接到主机的显示器。本文给出的答案建议将X-11套接字绑定到容器< code >-v/tmp/. X11-unix:/tmp/. X11-UNIX:ro ,并将其显示环境变量设置为主机< code>-e DISPLAY=$DISPLAY的显示环境变量,但由于这两个变量都是UNIX特定的路径/变量,因此它们在其他操作

  • #include <stdio.h> void fun1(void) { int i = 0; i++; i = i * 2; printf("%d\n", i); } void fun2(void) { int j = 0; fun1(); j++; j = j

  • 我正在jMeter中执行负载测试,其中有两个线程组,每个线程组都有50个用户,上升周期为60秒。使用Blazemeter,我记录了一个填写和提交表格的会话,然后稍微修改了一下。其中一组是使用POST方法登录,然后提交表单,另一组是匿名用户填写的。当我运行测试时,我遇到了错误: 响应代码:非HTTP响应代码:org.apache.HTTP。ConnectionClosedException响应消息: