更新Tkinter进度条

时间:2018-05-23 19:45:38

标签: python oop tkinter progress-bar

我已经制作了一个python脚本,用于从网站下载大量文件,我想在Tkinter中创建一个进度条,当每个文件保存到计算机时,它会更新。我已经看到了一些使用OOP的例子,但我仍然要掌握OOP,有一天希望了解人们在Tkinter制作GUI应用程序时使用OOP的原因。也许一位善良的用户可以为我澄清这一点。

我的代码显示在这里:

from Tkinter import *
import ttk
import numpy as np

global files
files = np.arange(1,1000000)

def loading():
    global downloaded
    downloaded = 0
    for i in array:
        downloaded +=1

root = Tk()

progress= ttk.Progressbar(root, orient = 'horizontal', maximum = 1000000, value = downloaded, mode = 'determinate')
progress.pack(fill=BOTH)
start = ttk.Button(root,text='start',command=loading)
start.pack(fill=BOTH)

root.mainloop()

我已经创建了一个表示文件数量的变量(我不是真的想下载1000000个文件,这只是一些代码来使进度条工作)。

单击开始按钮时代码应该运行加载功能,但是没有。我非常感谢你能在这个问题上给我任何帮助=)

1 个答案:

答案 0 :(得分:4)

在事件驱动编程(GUI)中,您不能像for循环一样有阻塞循环。您必须使用after设置事件才能再次运行某个功能。这与迭代器结合良好:

from Tkinter import *
import ttk
import numpy as np

root = Tk()

files = iter(np.arange(1,10000))


downloaded = IntVar()
def loading():
    try:
        downloaded.set(next(files)) # update the progress bar
        root.after(1, loading) # call this function again in 1 millisecond
    except StopIteration:
        # the files iterator is exhausted
        root.destroy()

progress= ttk.Progressbar(root, orient = 'horizontal', maximum = 10000, variable=downloaded, mode = 'determinate')
progress.pack(fill=BOTH)
start = ttk.Button(root,text='start',command=loading)
start.pack(fill=BOTH)

root.mainloop()