TKinter弹出进度条

时间:2017-01-27 14:58:54

标签: python 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

目前正在创建一个弹出窗口,但其中没有任何内容。如果有人有此经验,将非常感谢帮助!

谢谢, 泰勒

1 个答案:

答案 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()