2015-06-04 47 views
1

我已經得到了我寫在Python 3 我有包含在其中創建我的所有小工具類一個模塊一個Tkinter的應用。我正在嘗試從一個單獨的模塊更新進度條,它可以完成繁重的工作。Tkinter的:更新部件來自不同模塊

#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

一種方法是你打電話之前注入progress_barWork_Modulemainloop()

def create_widgets(self): 
     # global progress_bar (no longer needed) 
     # add 'self' 
     self.progress_bar = tk.ttk.Progressbar(orient=tk.HORIZONTAL, length=200, mode='determinate') 
     self.progress_bar.pack(side="bottom") 
     ... 

def main(): 
    root = tk.Tk() 
    app = Application(master=root) 
    Work_Module.progress_bar = self.progress_bar # add 'self' 
    app.mainloop() 
+0

這:

def main(): root = tk.Tk() app = Application(master=root) Work_Module.progress_bar = progress_bar app.mainloop() 

如果你喜歡,你還可以與progress_barglobal方面免除解決了無類型被分配到progress_bar的問題,但現在我看到的問題是進度條不會增量更新。在work_module完成所有工作後,進度條跳轉到最後。 – sager89

+0

@ sager89:你可能不得不讓/告訴'tkinter'更新屏幕。 –

+0

我不得不創建一個單獨的線程來完成這項工作,因爲GUI是一個阻塞呼叫。之後,它工作了! – sager89