我有一个Tkinter应用程序,我正在用Python 3编写。 我有一个模块,其中包含一个我创建所有小部件的类。我正在尝试从一个单独的模块中更新进度条,以完成繁重的工作。
#GUI.py
import tkinter as tk
from tkinter.filedialog import askopenfilename, askdirectory
import tkinter.ttk as ttk
import Work_Module
progress_bar = None
class Application(tk.Frame):
def __init__(self, master=None):
master.title('CCD Creator Version 1.0')
tk.Frame.__init__(self, master, width=500)
self.pack()
self.create_widgets()
def create_widgets(self):
global progress_bar
progress_bar = tk.ttk.Progressbar(orient=tk.HORIZONTAL, length=200, mode='determinate')
progress_bar.pack(side="bottom")
self.run = tk.Button(self, text=" Run ", fg="green", command=self.do_work)
self.run.pack(side="top")
#Continue creating various widgets that don't need to be updated by other modules
def do_work(self):
Work_Module.main()
def main():
root = tk.Tk()
app = Application(master=root)
app.mainloop()
if __name__ == '__main__':
main()
这是一个带有类的模块,它可以完成“繁重的工作”,我想跟踪进度。
#Work_Module.py
class Work:
def __init__(self):
#Do some intensive work
main():
for idx, job in enumerate(work_list):
Work()
import GUI
percentage_done = idx / len(job_list) * 100
GUI.progress_bar.step(percentage_done)
我遇到的问题是,progress_bar在Work_Module中的值为None。它在GUI模块中分配了一个对象,但在尝试从Work_Module引用它时,不保留该对象。我知道在main方法中导入GUI有点奇怪,我怀疑这是某种命名空间问题或循环导入问题,但我似乎无法想办法解决这个问题。
答案 0 :(得分:2)
一种方法是在致电progress_bar
之前将Work_Module
注入mainloop()
:
def main():
root = tk.Tk()
app = Application(master=root)
Work_Module.progress_bar = progress_bar
app.mainloop()
如果您愿意,还可以省略global
的{{1}}方面:
progress_bar