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 来做到这一点?

4

1 回答 1

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

如果您希望在任意变量反弹时触发……您基本上不能这样做。您需要将执行该分配的代码替换为与分配一起显式触发您的触发器的代码。


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

于 2013-04-30T01:20:31.757 回答