Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更改变量的值以调用函数?_Python_Tkinter_Bind - Fatal编程技术网

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

Python 如何更改变量的值以调用函数?,python,tkinter,bind,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.askokc

我试图在特定变量的值发生变化时调用一个函数。我想用它来装订,但我不能让它工作。以下是相关的代码片段:

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

如果希望在Tk变量发生更改时触发,可以使用以下方法:



如果希望在常规实例属性更改时触发,可以使用以下方法:



如果你想在任意变量反弹时触发…你基本上不能这么做。您需要将执行该赋值的代码替换为与赋值一起显式命中触发器的代码



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

如果您希望在Tk变量更改时触发,可以使用以下方法:



如果希望在常规实例属性更改时触发,可以使用以下方法:



如果你想在任意变量反弹时触发…你基本上不能这么做。您需要将执行该赋值的代码替换为与赋值一起显式命中触发器的代码



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

“当特定变量的值更改时”。您具体谈论的是什么变量?作为旁注:检查任何
都是0而不是
==0
是一个非常糟糕的主意。Python可以创建任意多个值为
0
的整数对象,您所关心的只是是否有
0
,而不是是否有与文本相同的对象。“当特定变量的值更改时”。您具体谈论的是什么变量?作为旁注:检查任何
都是0而不是
==0
是一个非常糟糕的主意。Python可以创建任意多个值为
0
的整数对象,您所关心的只是是否有
0
,而不是是否有与文本相同的对象。
self.textvar = Tk.StringVar()
def textvar_callback(self, *args):
    print('My textvar changed!')
self.textvar.trace('w', self.textvar_callback)
@property
def attr(self):
    return self._attr
@attr.setter
def attr(self, value):
    self._attr = attr
    print('My attr changed!')