我正在尝试制作一个弹出式进度条,显示单击按钮后某些文件下载的进度。我可以完美地执行与按钮链接的命令,但我正在努力创建一个弹出进度条。
这是我到目前为止所拥有的
def button_command(self):
#start progress bar
popup = tk.Toplevel()
tk.Label(popup, text="Files being downloaded").grid(row=0,column=0)
progress = 0
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(popup, variable=progress_var, maximum=100)
progress_bar.grid(row=1, column=0)#.pack(fill=tk.X, expand=1, side=tk.BOTTOM)
popup.pack_slaves()
progress_step = float(100.0/len(teams))
for team in self.teams:
self.do_work()
progress += progress_step
progress_var.set(progress)
popup.update_idletasks()
return 0
目前正在创建一个弹出窗口,但其中没有任何内容。如果有人有此经验,将非常感谢帮助!
谢谢, 泰勒
答案 0 :(得分:2)
我认为您的问题是由于{for循环中update_idletasks
的位置造成的。您在第一次调用self.do_work
后调用它,因此只有在任务完成后才会更新/显示带有进度条的GUI。至少,这是我通过time.sleep
而不是do_work
测试您的代码所体验到的。因此,您应该在启动第一个任务之前更新GUI。我还注意到,当我使用update
代替update_idletasks
时,进度条显示得越早,但我不知道为什么。
import tkinter as tk
from tkinter import ttk
from time import sleep
teams = range(100)
def button_command():
#start progress bar
popup = tk.Toplevel()
tk.Label(popup, text="Files being downloaded").grid(row=0,column=0)
progress = 0
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(popup, variable=progress_var, maximum=100)
progress_bar.grid(row=1, column=0)#.pack(fill=tk.X, expand=1, side=tk.BOTTOM)
popup.pack_slaves()
progress_step = float(100.0/len(teams))
for team in teams:
popup.update()
sleep(5) # lauch task
progress += progress_step
progress_var.set(progress)
return 0
root = tk.Tk()
tk.Button(root, text="Launch", command=button_command).pack()
root.mainloop()