更新 Tkinter 进度条

Posted

技术标签:

【中文标题】更新 Tkinter 进度条【英文标题】:Update Tkinter progress bar 【发布时间】:2018-11-02 21:56:18 【问题描述】:

我已经制作了一个用于从网站下载许多文件的 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 个文件,这只是一些让进度条工作的代码)。

当点击开始按钮时,代码应该运行加载函数,但它没有。我非常感谢您在这个问题上给我的任何帮助 =)

【问题讨论】:

你不需要使用global files,因为files已经在全局空间中定义了。 【参考方案1】:

在事件驱动编程 (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()

【讨论】:

感谢您的回答。你能解释一下加载函数中发生了什么以及为什么 files 应该是 numpy 数组的 iter 吗? 另外,函数完成后如何关闭根窗口而不是引发异常? iter 允许您使用next() 函数来获取下一个数字(或文件名或其他)。这是制作循环的便捷方式。使用 try 块更新代码以检测循环的结束。

以上是关于更新 Tkinter 进度条的主要内容,如果未能解决你的问题,请参考以下文章

如何循环更新进度条?

Tkinter 之ProgressBar进度条标签

python的Tkinter中的Windows进度条

用于多处理的 tkinter 进度条

将文本格式化到 Tkinter 进度条

tkinter 进度条