我正在尝试在更改特定变量的值时调用函数。我想过用它绑定但是我不能让它工作。以下是相关的代码段:
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 :(得分: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!')
如果你想在任意变量反弹时触发......你基本上不能这样做。您需要使用明确命中触发器的代码替换执行该分配的代码。
根据代码中的注释,您根本不会尝试触发变量,而是触发函数调用的结果。你不能这样做。函数调用返回一个稍后不会更改的值。获取新值的唯一方法是再次调用该函数。你需要找出将函数调用放到事件循环中的位置(或者,如果不可能的话,产生一个以阻塞方式重复调用该函数的后台线程,并以某种方式向主线程发送信号)。