首页 > 解决方案 > 使用 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)

标签: pythonpython-3.xopenpyxl

解决方案


如果您事先知道要下载多少字节(并且我假设您知道文件大小,所以您会这样做),最简单的做法是将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上的进度条示例很有用。

归功于这篇文章。


推荐阅读