在完成循环计算之前,不会出现循环进度条

时间:2020-06-28 20:40:52

标签: python tkinter

我很难理解进度条在循环环境中的工作方式。我的示例如下:

import time
from tkinter import ttk,Tk, Label, Button,Label,DoubleVar
MAX = 4

root = Tk()

root.title("My Progressbar")
root.geometry('500x500')

theLabel = Label(root, text="Progress")
theLabel.pack()

progress_var = DoubleVar() 
progress_var.set(0)
progressbar = ttk.Progressbar(root, variable=progress_var, 
length=400,maximum=MAX,mode='determinate')
progressbar.pack()


for i in range(MAX+1):
    print(i) #Where I will eventually do all my work. Here I print i and pause .5 sec
    time.sleep(.5)
    progress_var.set(i)
    root.update_idletasks()

# Add quit button
def _quit():
        root.quit()
        root.destroy()

quit_button = Button(master=root, text="Quit", bg='lightgray',command=_quit)
quit_button.pack()

root.mainloop()

我遗漏了一些明显的东西,因为直到循环完成后才出现该栏。另外,是否可以在条形的某处指示完成百分比?

2 个答案:

答案 0 :(得分:1)

您在执行流程甚至没有机会到达root.mainloop之前就进行了“工作”。您需要在启动mainloop之后模拟完成这项工作。也许您可以添加一个按钮,单击该按钮即可模拟工作?试试这个:

# ...

def do_work():
    for i in range(MAX+1):
        print(i) #Where I will eventually do all my work. Here I print i and pause .5 sec
        time.sleep(.5)
        progress_var.set(i)
        root.update_idletasks()

# ...

do_work_button = Button(master=root, text="Do Work", command=do_work)
do_work_button.pack()

root.mainloop()

答案 1 :(得分:0)

如果您只想每0.5秒增加一次进度栏中的值,请尝试以下操作:

import time
from tkinter import ttk,Tk, Label, Button,Label,DoubleVar
MAX = 4

root = Tk()

root.title("My Progressbar")
root.geometry('500x500')

theLabel = Label(root, text="Progress")
theLabel.pack()

progress_var = DoubleVar()
progress_var.set(0)
progressbar = ttk.Progressbar(root, variable=progress_var,
length=400,maximum=MAX,mode='determinate')
progressbar.pack()

def add():
    if progress_var.get() < MAX:
        print(progress_var.get())
        progress_var.set(progress_var.get()+1)
    root.after(500, add)

# Add quit button
def _quit():
    root.quit()
    root.destroy()

quit_button = Button(master=root, text="Quit", bg='lightgray',command=_quit)
quit_button.pack()

root.after(500, add)

root.mainloop()

如果是特定工作,则需要创建线程或进程。