为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免特金特 GUI 在蟒蛇 3 中冻结?

如何避免特金特 GUI 在蟒蛇 3 中冻结?

慕田峪7331174 2022-09-27 16:40:36
我是python的新手,并制作了一个Tkinter应用程序,当按下开始按钮时,它将执行目录中存在的所有python文件。我的 GUI 还具有用于查看当前进度的进度条。所以这是我的代码import osfrom tkinter import *from tkinter.ttk import *from tkinter import messageboxdirectory = 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 = 0def begin():    global v    for x in files:        os.system('pyinstaller '+x)        v=v+1        p['value']=vp = 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解冻并且进度条立即填满...所以我希望GUI在处理时不要冻结,并在进度条上显示正确的进度。示例代码和解释对我来说会更好。感谢您的宝贵时间...
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这奏效了。无需使用检查线程是否已完成。.after()


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()


查看完整回答
反对 回复 2022-09-27
?
万千封印

TA贡献1891条经验 获得超3个赞

首先,按钮的参数可以只是:。commandcommand=begin

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

上面的链接将您带到我网站上的一篇文章,我将简单的命令行程序与等效的GUI程序进行了比较。虽然该程序不使用外部进程,但它说明了原理。

在 GUI 中执行此操作的正确方法是从按钮回调开始 。然后使用该方法定期运行检查 是否已完成的回调,然后启动新进程。multiprocessing.Processroot.afterProcess


查看完整回答
反对 回复 2022-09-27
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号