我是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
连接起来。
任何帮助实现这一目标并将progressBar
从UpdateProgressbar
中排除的帮助,我们深表感谢。
编辑:
以下是基于注释输入的有效版本。它现在可能非常漂亮,但目前正在按照我的预期做。如果您看到一些改进的可能性,请告诉我。
在进度栏中进行每次更改后,必须调用 __init__
才能显示错误,并使用app.update()
删除旧标签。
self.progressLabel.destroy()
只是显示更改的一种方式,不会成为最终代码的一部分。
timeit.sleep()