2017-01-27 53 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更改爲只是更新可能看起來很小,它解決了我的問題!感謝幫助 –