从主要函数/类外部更新tkinter进度栏

我是Python的新手,对类没有很丰富的经验,但是现在正在致力于创建tkinter GUI进行数据处理。

由于许多耗时的过程正在用户不可见的背景下发生,我想插入一个进度条,以Progress的形式显示0到100之间的当前进度,并显示处理步骤{{1 }}在主窗口中

现在,当代码使用其他函数进行数据处理时,我在访问类外部的条形参数(值和标签/名称)时遇到问题。

以下是Python 3.7中GUI的有效示例

action

在此示例中,import time import tkinter as tk from tkinter import ttk def ProcessingScript(): ### UpdateProgressbar(50,'Halfway there') ### time.sleep(2) print('Processing takes place here') ### UpdateProgressbar(75,'Finishing up') ### time.sleep(2) class SampleApp(tk.Tk): def __init__(self,*args,**kwargs): tk.Tk.__init__(self,**kwargs) container = tk.Frame(self,width=500,height=500) container.pack(side="top",fill="both",expand=True) container.grid_rowconfigure(0,weight=1) container.grid_columnconfigure(0,weight=1) self.geometry("500x500") self.frames = {} frame = ProcessingPage(container,self) self.frames[ProcessingPage] = frame frame.grid(row=0,column=0,sticky="nsew") self.show_frame(ProcessingPage) def show_frame(self,cont): frame = self.frames[cont] frame.tkraise() class ProcessingPage(tk.Frame): def __init__(self,parent,controller,): tk.Frame.__init__(self,parent) self.controller = controller def PlotData(): UpdateProgressbar(10,'Generating...') # Execute Main Plotting Function here ProcessingScript() UpdateProgressbar(100,'Finished Plot') def UpdateProgressbar(Progress,action): progressLabel = tk.Label(self,text=action).place(x=20,y=440) progressBar['value'] = Progress progressBar = ttk.Progressbar(self,orient="horizontal",length=200,mode="determinate") progressBar.place(x=20,y=470) progressBar['value'] = 0 progressLabel = tk.Label(self,text='Idle...').place(x=20,y=440) PlotButton = tk.Button(self,text='Plot Data',command= PlotData) PlotButton.place(x=20,y=320) if __name__ == "__main__": app = SampleApp() app.mainloop() 函数位于另一个文件中,作为理想的结果,我希望能够从其他脚本中的任何位置调用ProcessingScript函数以更新栏。

注意:我知道UpdateProgressbar函数内部的函数不是最佳实践,但是由于无法找到其他方法,因此无法使其以任何其他方式运行将__init__函数的结果与创建的UpdateProgressbar连接起来。

任何帮助实现这一目标并将progressBarUpdateProgressbar中排除的帮助,我们深表感谢。


编辑:

以下是基于注释输入的有效版本。它现在可能非常漂亮,但目前正在按照我的预期做。如果您看到一些改进的可能性,请告诉我。

在进度栏中进行每次更改后,必须调用

__init__才能显示错误,并使用app.update()删除旧标签。 self.progressLabel.destroy()只是显示更改的一种方式,不会成为最终代码的一部分。

timeit.sleep()
drx321 回答:从主要函数/类外部更新tkinter进度栏

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3163048.html

大家都在问