我想知道我是否可以显示我正在加载的工作簿的进度条(或类似的东西(,以便用户可以知道需要多长时间。
我正在使用openpyxl来加载工作簿。
代码示例:
from openpyxl import load_workbook
sheet = 'my_sheet.xlsl'
# I want to load the workbook, as below, but I would like to
# show some loading progress info like a bar or %
my_workbook = load_workbook(sheet)
如果您事先知道要下载多少字节(我假设您知道,因为您知道文件大小(,最简单的方法是将maxvalue
选项设置为您要读取的数字。然后,每次读取区块时,都将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 线程。这意味着要么在块中读取(如示例中所示(,要么在单独的线程中进行读取。如果使用线程,您将无法直接调用进度条方法,因为 tkinter 是单线程的。
您可能会发现 tkdocs.com 上的进度条示例很有用。
感谢这篇文章。