我有一个siplme GUI执行一些耗时的操作。我想制作一个在每次操作后都会更新的进度条。但似乎无法完成。
没有使用update或update_idletask的解决方案(或者我以错误的方式使用它)。因此,目标是在每次循环迭代中更新进度条。而.after()的解决方案在这里并不合适,因为该函数是通过按钮点击运行的。
示例代码:
from tkinter import *
from tkinter.ttk import Progressbar
from time import sleep
def RunThat():
global pb
for i in range(0,101,10):
pb["value"]=i
pb.update() #this works
sleep(0.1)
print(i)
master=Tk()
Label(master,text="Doing something...").grid(row=0,column=0,pady=10)
Grid.columnconfigure(master,0,weight=1)
Label(master,text="Progress:",justify=LEFT).grid(row=1,column=0,padx=25,pady=2,sticky=W+S)
Grid.rowconfigure(master,1,weight=1)
pb=Progressbar(master)
pb.grid(row=2,column=0,padx=25,pady=2,sticky=W+E)
pb["maximum"]=100
pb["value"]=0
Button(master,text="Do it",command=RunThat).grid(row=3,column=0,padx=5,pady=5)
master.mainloop()
答案 0 :(得分:1)
毫无疑问,进度条更新的唯一方法是运行事件循环,以便它可以为请求重绘的事件提供服务。当您要求应用程序休眠或具有长时间运行的功能时,事件循环无法为请求提供服务。
这意味着您必须调用update
或update_idletasks
,重构长时间运行的函数以使用事件循环,或者您需要在单独的进程或线程中运行此函数。