如何更改变量值以调用函数?

时间:2013-04-30 00:47:09

标签: python tkinter bind

我正在尝试在更改特定变量的值时调用函数。我想过用它绑定但是我不能让它工作。以下是相关的代码段:

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执行此操作?

1 个答案:

答案 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!')

如果你想在任意变量反弹时触发......你基本上不能这样做。您需要使用明确命中触发器的代码替换执行该分配的代码。


根据代码中的注释,您根本不会尝试触发变量,而是触发函数调用的结果。你不能这样做。函数调用返回一个稍后不会更改的值。获取新值的唯一方法是再次调用该函数。你需要找出将函数调用放到事件循环中的位置(或者,如果不可能的话,产生一个以阻塞方式重复调用该函数的后台线程,并以某种方式向主线程发送信号)。