Tkinter:从不同模块更新小部件

时间:2015-06-04 18:11:17

标签: python python-3.x tkinter

我有一个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有点奇怪,我怀疑这是某种命名空间问题或循环导入问题,但我似乎无法想办法解决这个问题。

1 个答案:

答案 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