2013-04-30 120 views
0

我試圖做一個函數被調用時,特定變量的值被改變。我想過使用它來綁定,但我不能讓它工作。這裏是相關的代碼片段:如何改變一個變量的值來調用一個函數?

def runSim (self): 

    if self.openned.get() == 1: 
     self.p = multiprocessing.Process(target= self.runProg).start() 

    elif self.openned.get() == 0: 
     saveFirst = tkMessageBox.askokcancel("Warning", 
              "This is a new file. For run this, please save first") 
     if saveFirst: 
      self.saveAs() 
      self.openned.set(1) 
      self.p = multiprocessing.Process(target= self.runProg).start() 

def runProg(self): 
    """This funcion will run the simulation""" 

    a = open(self.nameFile.get(),"w") 
    self.writeFile() 

    self.process = subprocess.Popen([self.cmdSys.get()+self.dV.get()+ 
            self.extension.get(),self.nameFile.get()]) 
    self.pid.set(self.process.pid) 
    if self.process.wait() is 0: 
     #here is the part where the function have to be called when the variable's values is changed!!! 

def callMsg(self): 
    tkMessageBox.showinfo("","Your simulation was completed sucessfully.") 

我該如何使用BIND來做到這一點?

+0

「當特定變量的值發生變化時」。你在說什麼變量? – mgilson 2013-04-30 01:08:14

+1

作爲一個方面說明:檢查什麼'是0'而不是'== 0'是一個非常糟糕的主意。 Python允許創建任意數量的值爲'0'的整數對象,而您所關心的是您是否擁有'0',而不是您是否擁有與文字相同的對象。 – abarnert 2013-04-30 01:25:48

回答

4

如果你正在尋找時,Tk的變量被改爲觸發,你可以做到這一點與trace方法:

self.textvar = Tk.StringVar() 
def textvar_callback(self, *args): 
    print('My textvar changed!') 
self.textvar.trace('w', self.textvar_callback) 

如果你正在尋找的時候經常實例屬性得到觸發變了,你可以做到這一點與@property

@property 
def attr(self): 
    return self._attr 
@attr.setter 
def attr(self, value): 
    self._attr = attr 
    print('My attr changed!') 

如果你正在尋找ŧ o當任意變量被反彈時觸發......你基本上不能這樣做。您需要將代碼與代碼一起替換爲明確命中觸發器的代碼。


並且根據代碼中的註釋,您並不試圖觸發變量,而是關閉函數調用的結果。你不能這樣做。函數調用返回一個不會改變的值。獲得新值的唯一方法是再次調用該函數。您需要計算出將函數調用放入事件循環的位置(或者,如果不可行,則產生後臺線程以阻塞的方式重複調用該函數,並以某種方式向主線程發送信號)。

相關問題