2013-10-05 69 views
1

在具有兩個模塊的應用程序中:GUI.py和calcs.py,其中GUI導入和使用calc的函數,calcs函數更新a的好方法是什麼GUI中的進度條?將模塊傳遞值函數調用到父模塊

當我將所有代碼放在一個模塊中時,它過去很簡單。我將它重構爲兩個(仍在學習...),這是我現在無法修復的唯一的東西。

例如作爲一個非常簡單的例子,具有GUI.py模塊:

import tkinter as tk 
import tkinter.ttk as ttk 
import calc as c 

class GUI(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.prog = tk.DoubleVar() 
     self.result = tk.StringVar() 
     self.label = ttk.Label(textvariable = self.result) 
     self.progbar = ttk.Progressbar(self, maximum = 10, variable = self.prog) 
     self.button= ttk.Button(self, text = 'Go', command = lambda: self.result.set(c.stuff())) 
     self.label.pack() 
     self.progbar.pack() 
     self.button.pack() 

a = GUI() 
a.mainloop() 

,並具有calc.py:

def stuff(): 
    counter = 0 
    for i in range(1, 11, 1): 
     counter += 1 
     # find a way to pass the value of counter to the GUI progress bar 
     # do lots of stuff that takes quite some time 
    return 'hey, a result!' 

什麼是進度計數器在計算功能與進步聯繫起來的好方法在GUI中的變量?

當他們在一個模塊中一起這當然是很簡單 - 可以只調用

prog.set(counter) 
a.update_idletasks() 

,但不再。谷歌搜索和閱讀有關我嘗試使它線程和使用隊列來鏈接它們,但這a)似乎是矯枉過正和b)很難...我沒有得到它的工作...

回答

1

在您的創建一個函數GUI模塊更新進度條,併爲該函數提供一個參數作爲您的計算函數的參數:

# GUI.py 
class GUI(...): 
    def __init__(...): 
     ... 
     self.button= ttk.Button(..., command = lambda: c.stuff(self)) 
     ... 
    def update_progress(self): 
     ... 

# calc.py 
def stuff(gui): 
    for i in range(...): 
     ... 
     gui.update_progress() 
+0

哦,我明白了。所以我可以將一個對gui.py類的引用傳遞給calc.py函數。這會讓事情變得簡單!我沒有意識到(假設這意味着要在calc.py中導入gui.py,並且需要在每個模塊嘗試導入另一個導入的循環中導入一組循環)。 – Tom