2017-01-27 46 views
0

我试图做一个弹出进度条,显示单击按钮后下载某些文件的进度。我可以完美地执行与按钮链接的命令,但我正在努力创建一个弹出式进度条。TKinter弹出进度条

这里是我迄今为止

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 

它目前正在创建一个弹出窗口,但什么也没有。如果有人有这方面的经验,将非常感谢帮助!

感谢, 泰勒

回答

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

虽然从update_idletasks更改为只是更新可能看起来很小,它解决了我的问题!感谢帮助 –