繁体   English   中英

使用Excel的Tkinter进度栏

[英]Tkinter progress bar with Excel

我们有一个Pyxll应用程序(用python编写的Excel应用程序),该应用程序在打开工作簿时发出一堆获取数据的请求。 我们希望在发出请求时向用户显示加载栏,并在每个请求返回后更新加载栏。

我正在尝试使用Tkinter来执行此操作,但是遇到了问题。 我可以弹出一个进度条,但是它会阻止Excel运行,直到您关闭进度条的窗口。 我不能将其放在其他线程中,因为我希望能够根据HTTP请求返回的时间来更新进度。 是否有捷径可寻?

到目前为止,这是我的代码。 我做了一个基本的加载栏类:

import Tkinter as tk
import ttk

class OrderingProgressBar(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # progress goes from 0-100 (for percentage)
        self.progress = 0
        self.max_progress = 100

        self.progress_bar = ttk.Progressbar(self, orient="horizontal", length=200, mode="determinate", maximum=self.max_progress)
        self.progress_bar.pack()

然后,我有一个宏被调用以启动应用程序并开始发出请求。

def launch_ordering_terminal(ribbon):
    """Launch all of the apps required for the Ordering Terminal"""
    ordering_progress_bar = OrderingProgressBar()
    ordering_progress_bar.mainloop()

    excel_utils.turn_off_excel_updates(xl_app())
    launch_allocation_app(manager_id)
    ordering_progress_bar.progress_bar.step(25)
    launch_si_app(manager_id)
    ordering_progress_bar.progress_bar.step(25)
    launch_accounting_app(manager_id)
    ordering_progress_bar.progress_bar.step(25)
    launch_reports_builder(terminal_mode)
    ordering_progress_bar.progress_bar.step(25)
    excel_utils.turn_on_excel_updates(xl_app())

使用此代码,当我调用宏时,会弹出一个加载栏,但会阻止Excel。 如果我关闭窗口,它将继续。 如果我移动的mainloop调用结束launch_ordering_terminal ,那么整个终端负载,然后弹出的加载条。 我不能让他们同时工作。

先谢谢您的帮助!

维护GUI是一项全职工作,需要无休止的循环,称为“主循环”。 如果要在此期间做其他事情,则需要将其添加到主循环中,或在其他线程中进行。 在您的情况下,我认为一个新线程将是最简单的。 Tkinter在主线程中运行最好,因此将代码放在子线程中。

完全未经测试的猜测:

from threading import Thread

def do_stuff(ordering_progress_bar):
    excel_utils.turn_off_excel_updates(xl_app())
    launch_allocation_app(manager_id)
    ordering_progress_bar.progress_bar.step(25)
    launch_si_app(manager_id)
    ordering_progress_bar.progress_bar.step(25)
    launch_accounting_app(manager_id)
    ordering_progress_bar.progress_bar.step(25)
    launch_reports_builder(terminal_mode)
    ordering_progress_bar.progress_bar.step(25)
    excel_utils.turn_on_excel_updates(xl_app())
    ordering_progress_bar.quit() # kill the GUI

def launch_ordering_terminal(ribbon):
    """Launch all of the apps required for the Ordering Terminal"""
    ordering_progress_bar = OrderingProgressBar()
    t = Thread(target=do_stuff, args=(ordering_progress_bar,))
    t.start()
    ordering_progress_bar.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM