使用 openpyxl 加载工作簿时的进度条



我想知道我是否可以显示我正在加载的工作簿的进度条(或类似的东西(,以便用户可以知道需要多长时间。

我正在使用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 上的进度条示例很有用。

感谢这篇文章。

最新更新