【问题标题】:How to add progress bar to functions in Tkinter如何在 Tkinter 中为函数添加进度条
【发布时间】:2021-06-23 06:42:12
【问题描述】:

我创建了 2 个使用 tkinter 库导入 Excel 文件的按钮。我还为每个相应的按钮创建了函数,以便当用户单击该按钮时该函数将运行。所有按钮都工作正常,但我想知道如何为每个按钮添加进度条,以便用户可以看到何时导入文件和执行代码。我查看了其他类似的帖子,但并没有真正的帮助。

这是我的代码:

from tkinter import *
from tkinter import filedialog
import pandas as pd
import numpy as np
from tkinter import ttk

def open_ec_file():
    global ec_df
    #pandas code goes here

def open_lms_file():
    global lms_df
    #pandas code goes here

window = Tk()
#Set title
window.title ('Report Generator')
# Set window size
window.geometry("800x500")
# add logo
window.iconbitmap('logo.ico')

Button(window, text = 'Import EC employee data', command = open_ec_file, bg = 'red', fg = 'white',
       height = 2, font = 'none 14 bold') .grid(row = 2, sticky = E, padx = 6, pady = 8 )
Button(window, text = 'Import LMS data', command = open_lms_file, bg = 'red', fg = 'white',
       font = 'none 14 bold') .grid(row = 4, column = 5, sticky = E, padx = 6, pady = 8 )

【问题讨论】:

  • 您面临的具体问题是什么?将进度条添加到对话框中,或者更新它,或者找出函数将运行多长时间?
  • @tobias_k 我想知道如何在按钮下添加进度条。我想添加HORIZONTAL indeterminate 类型,直到代码被执行。因此,当文件成功导入后,用户可以在进度条上看到 100% 类似这样的内容。
  • 导入了哪些文件?
  • @CoolCloud 来自用户计算机的 Excel 文件格式的原始数据
  • 可能把它放在一个线程中,然后检查线程是否存活,确保线程没有GUI的东西

标签: python tkinter


【解决方案1】:

如果您可以选择在代码中的某些点手动更新进度条,我会执行以下操作:

from tkinter import *
from tkinter import ttk
import time


def update_progress(value):
    progress_bar["value"] = value
    window.update()


def your_time_consuming_function():
    print("Starting function")
    update_progress(0)
    time.sleep(2)
    print("I reached my first checkpoint")
    update_progress(25)
    time.sleep(2)
    print("Another checkpoint, yay")
    update_progress(50)
    time.sleep(2)
    print("Only 1 more to go")
    update_progress(75)
    time.sleep(2)
    print("Yay im finished")
    update_progress(100)


window = Tk()
#Set title
window.title ('Report Generator')
# Set window size
window.geometry("800x500")
# add logo
# window.iconbitmap('logo.ico')

progress_bar = ttk.Progressbar(window, length=100, mode="determinate", orient="horizontal")
progress_bar.grid(row=99, column=0, sticky=E, padx=2, pady=2)

Button(window, text='Test progressbar', command=your_time_consuming_function, bg='red', fg='white',
       height=2, font='none 14 bold').grid(row=2, sticky=E, padx=6, pady=8 )

window.mainloop()

您可以通过调用update_progress(value) 为任何功能使用相同的进度条。

【讨论】:

  • 是否可以将Progressbar模式设为"indeterminate"
  • 我不确定您的目标是什么,但请查看this post
  • 我希望进度条在加载文件时开始运行,并在执行函数代码时完成。您的上述解决方案也有效,但在单击按钮时加载文件时无法运行。
  • 对不起,我真的不明白你的问题。要么您手动确定进度,要么您有一个带有停止信号(这不是最简单的任务)的线程或进程,它告诉进度条停止。我建议您在文件加载脚本中确定一个全局 loading_progress 变量(可以在单独的 .py 文件中),然后像我解释的那样将该参数交给您的进度条值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
相关资源
最近更新 更多