Индикатор выполнения при загрузке книги с помощью openpyxl - PullRequest
0 голосов
/ 21 января 2020

Мне интересно, возможно ли мне показать индикатор выполнения (или что-то подобное) загружаемой книги, чтобы пользователь мог знать, сколько времени это займет.

I ' m, используя 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)

1 Ответ

1 голос
/ 21 января 2020

Если вы заранее знаете, сколько байтов вы собираетесь загрузить (и я предполагаю, что вы это сделаете, поскольку знаете размер файла), самое простое, что нужно сделать, - установить для параметра 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. Это означает, что вы либо читаете по частям (как в примере), либо читаете в отдельном потоке. Если вы используете потоки, вы не сможете напрямую вызывать методы progressbar, потому что tkinter является однопоточным.

Может оказаться полезным пример выполнения на tkdocs.com , который будет полезен.

Кредит этой записи.

...