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

我怎么能避免在Python3的Tkinter GUI冻结?

林修真
2023-03-14

我是python新手,制作了一个Tkinter应用程序,当按下开始按钮时,它将执行目录中存在的所有python文件。我的GUI也有progressbar来查看当前的进度。

这是我的代码

import os
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox

directory = dir_path = os.path.dirname(os.path.realpath(__file__))

files = os.listdir(directory)


root = Tk()
root.geometry('200x200')
root.maxsize(200,200)
root.minsize(200,200)
root.title('PYTOEXE')

v = 0
def begin():
    global v
    for x in files:
        os.system('pyinstaller '+x)
        v=v+1
        p['value']=v


p = Progressbar(root,length=200,max=len(files))

b = Button(root,text="Start",command=lambda: begin())



p.place(x=0,y=0)
b.place(x=62,y=30)

root.mainloop()

但我的问题是,每当我按下开始按钮,GUI就会冻结,代码开始编译,完成后,GUI就会解冻,Progressbar会立即填满自己。。。

因此,我希望GUI在处理时不要冻结,并在Progressbar上显示正确的进度。

示例代码和解释将更适合我。

谢谢你宝贵的时间...

共有2个答案

盖锐
2023-03-14

首先,按钮的命令参数可以是:命令=开始

tkinter这样的GUI工具包是事件驱动的。它们依赖于流畅的键盘和鼠标事件流来正常工作。回调(如按钮中的命令)是从事件循环(root.mainloop)中调用的。所以回调应该只需要很短的时间(比如50毫秒),以免冻结GUI。因此,您不应该在回调中运行长时间运行的循环。你必须以不同的风格编程。

上面的链接带你去看我网站上的一篇文章,我在那里比较了一个简单的命令行程序和一个等效的GUI程序。虽然该程序不使用外部进程,但它说明了原理

在GUI中执行此操作的正确方法是启动多处理。从按钮回调处理。然后使用根目录。方法定期运行回调,检查进程是否完成,然后启动新进程。

夹谷山
2023-03-14

这奏效了。不需要使用.在()检查线程完成后。

import os
from tkinter import *
from tkinter.ttk import *
import threading

def use_pyinstaller(): # this function is to execute pyinstaller command and add value to progressbar.
    v = 0
    for x in files:
        os.system('pyinstaller '+x)
        v+=1
        p['value'] = v

def begin():
    threading.Thread(target=use_pyinstaller).start() # create a non-block thread to start the function.

directory = dir_path = os.path.dirname(os.path.realpath(__file__))
files = os.listdir(directory)
root = Tk()
root.geometry('200x200')
root.maxsize(200,200)
root.minsize(200,200)
root.title('PYTOEXE')

p = Progressbar(root,length=200,max=len(files))
b = Button(root,text="Start",command=begin)

p.place(x=0,y=0)
b.place(x=62,y=30)

root.mainloop()
 类似资料:
  • 问题内容: 我开发了一个简单的Python应用程序来做一些事情,然后决定使用Tkinter添加一个简单的GUI。 问题在于,当main函数正在执行其工作时,窗口会冻结。 我知道这是一个普遍的问题,我已经读过我应该使用多线程(非常复杂,因为该函数还会更新GUI)或将我的代码划分为不同的函数,每个函数工作一段时间。无论如何,我不想为这样一个愚蠢的应用程序更改代码。 我的问题是:有没有简便的方法可以每秒

  • 我开发了一个简单的Python应用程序,做了一些工作,然后我决定使用Tkinter添加一个简单的GUI。 问题是,当主函数在做它的事情时,窗口冻结了。 我知道这是一个常见的问题,我已经读到我应该使用多线程(非常复杂,因为函数也更新图形用户界面)或者在不同的函数中划分我的代码,每一个都工作一点时间。无论如何,我不想为这样一个愚蠢的应用程序更改我的代码。 我的问题是:是否有可能没有一种简单的方法可以每

  • 本文向大家介绍RabbitMQ 怎么避免消息丢失?相关面试题,主要包含被问及RabbitMQ 怎么避免消息丢失?时的应答技巧和注意事项,需要的朋友参考一下 把消息持久化磁盘,保证服务器重启消息不丢失。 每个集群中至少有一个物理磁盘,保证消息落入磁盘。

  • 本文向大家介绍项目延期怎么解决的?怎么避免项目延期?相关面试题,主要包含被问及项目延期怎么解决的?怎么避免项目延期?时的应答技巧和注意事项,需要的朋友参考一下 此问题考察的是沟通协调能力以及项目推动能力。 第一点,项目延期怎么处理? 了解情况:了解不能按时上线的原因及需要延期多长时间上线; 知会需求方:确定影响范围,知会需求方,讨论解决方案; 确定解决方案:协调资源加班解决;或者砍掉非核心功能保障

  • 本文向大家介绍ANR是什么?怎样避免和解决ANR相关面试题,主要包含被问及ANR是什么?怎样避免和解决ANR时的应答技巧和注意事项,需要的朋友参考一下 Application Not Responding,即应用无响应 出现的原因有三种: a)KeyDispatchTimeout(5 seconds)主要类型按键或触摸事件在特定时间内无响应 b)BroadcastTimeout(10 second

  • 我正在浏览Apache FOP快速入门。从命令行,我将一个包含svg元素的简单xml文件转换成pdf文件。我可以做到这一点,但由svg生成的图像被切断。我不熟悉XSL-FO 以下是xml: 下面是xsl: 图像应该显示红色 我缺少了哪些属性,如何才能正确显示整个svg图像(两个完整的圆圈重叠)? 谢谢, 勃兰特 附言:我会发一张图片来展示这个问题,但是我没有足够高的声誉。