我是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上显示正确的进度。
示例代码和解释将更适合我。
谢谢你宝贵的时间...
首先,按钮的命令
参数可以是:命令=开始
。
像tkinter
这样的GUI工具包是事件驱动的。它们依赖于流畅的键盘和鼠标事件流来正常工作。回调(如按钮中的命令
)是从事件循环(root.mainloop
)中调用的。所以回调应该只需要很短的时间(比如50毫秒),以免冻结GUI。因此,您不应该在回调中运行长时间运行的循环。你必须以不同的风格编程。
上面的链接带你去看我网站上的一篇文章,我在那里比较了一个简单的命令行程序和一个等效的GUI程序。虽然该程序不使用外部进程,但它说明了原理。
在GUI中执行此操作的正确方法是启动多处理。从按钮回调处理
。然后使用根目录。方法定期运行回调,检查
进程是否完成,然后启动新进程。
这奏效了。不需要使用.在()
检查线程完成后。
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图像(两个完整的圆圈重叠)? 谢谢, 勃兰特 附言:我会发一张图片来展示这个问题,但是我没有足够高的声誉。