python - 使用 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上的进度条示例很有用。
归功于这篇文章。
推荐阅读
- python - x 轴刻度线未出现在图表中
- python - Python字典中的一个键有多个值
- c# - Xamarin 表单:将 *Shared Resource* 图像绑定到 ListView?
- javascript - JavaScript btoa() 到 Python b64decode().decode("utf-8")
- bash - 并行化以文件名作为参数并包含 if 语句的命令块?
- python - 在 Google Colaboratory 中,URL 重定向是否存在 read_csv 问题?
- javascript - 从 HTML 按钮中的 javascript 函数加载谷歌地图方向层的问题
- php - CRUD PHP 系统“不可接受!” 尝试创建新的 mysql 行时出错
- python - 在循环内定义函数会为每次迭代重新定义函数,或者python可以优化它吗?
- reactjs - React js 小组件性能影响