gpt4 book ai didi

python - 如何在ttk中创建下载进度条?

转载 作者:IT老高 更新时间:2023-10-28 22:18:03 34 4
gpt4 key购买 nike

我想在使用 urllib.urlretrive 方法从 Web 下载文件时显示进度条。

如何使用 ttk.Progressbar 来完成这项任务?

这是我到目前为止所做的:

from tkinter import ttk
from tkinter import *

root = Tk()

pb = ttk.Progressbar(root, orient="horizontal", length=200, mode="determinate")
pb.pack()
pb.start()

root.mainloop()

但它只是不断循环。

最佳答案

对于确定模式,您不想调用 start。相反,只需配置小部件的 value 或调用 step 方法。

如果您事先知道要下载多少字节(我假设您这样做,因为您使用的是确定模式),最简单的做法是将 maxvalue 选项设置为你要读的数字。然后,每次读取一个 block 时,您将 value 配置为读取的字节总数。然后进度条会计算百分比。

这是一个模拟,可以给你一个粗略的想法:

import tkinter as tk
from tkinter import ttk


class SampleApp(tk.Tk):

def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.button = ttk.Button(text="start", command=self.start)
self.button.pack()
self.progress = ttk.Progressbar(self, orient="horizontal",
length=200, mode="determinate")
self.progress.pack()

self.bytes = 0
self.maxbytes = 0

def start(self):
self.progress["value"] = 0
self.maxbytes = 50000
self.progress["maximum"] = 50000
self.read_bytes()

def read_bytes(self):
'''simulate reading 500 bytes; update progress bar'''
self.bytes += 500
self.progress["value"] = self.bytes
if self.bytes < self.maxbytes:
# read more bytes after 100 ms
self.after(100, self.read_bytes)

app = SampleApp()
app.mainloop()

为此,您需要确保不阻塞 GUI 线程。这意味着您要么分 block 阅读(如示例中所示),要么在单独的线程中阅读。如果您使用线程,您将无法直接调用进度条方法,因为 tkinter 是单线程的。

您可能会找到 progressbar exampletkdocs.com有用。

关于python - 如何在ttk中创建下载进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310511/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com