小部件由用户/编程方式更改时的不同回调

时间:2014-07-13 08:54:14

标签: python callback tkinter

我有一个python tkinter GUI应用程序,其代码如下:

    #on/off
    self.on_off_label=Label(app,text="ON/OFF:")
    self.on_off=StringVar(app)
    #self.on_off.set("off" if self.lastStatus["on"]==0 else "on")
    self.on_off_button=OptionMenu(app,self.on_off,"on","off")
    self.on_off.trace("w",self.on_off_changed)

OptionMenu应该打开/关闭远程设备。但是这个设备会定期将其状态发送回app变量(让我们称之为状态)。现在的问题是on_off_changed回调行为 如果用户更改OptionMenu值,我想向此远程设备发送命令以自行打开/关闭。但是当此设备发送的状态(用户使用设备切换)与OptionMenu中显示的状态不同时,我只想根据远程设备状态设置正确的值,不要向其发送任何命令(与GUI同步。) 怎么能实现这一目标?我想出的唯一解决方案是全局布尔标志。

我希望我的问题是可以理解的,谢谢你的建议。

修改
这是定期从设备接收状态的功能

def update():
  status=getStatus()#dict like {"power":on, etc.} is recieved

  if "power" in status and self.on_off.get()!=status["power"]:

    self.on_off.set(status["power"])

问题是触发了on_off_change()绑定到OptionMenu,我现在不想要。

1 个答案:

答案 0 :(得分:0)

您可以使用额外的变量 - 我称之为can_change_it = True 您可以在False之前在update()中设置self.on_off.set() on_off_changed()在执行某项操作之前必须先检查if can_change_it: 并且必须在最后再次设置True

其他方法 - 暂时删除trace

trace()返回uniqe跟踪器编号/名称,你必须记住它。

self.trace_id = self.on_off.trace("w",self.on_off_changed)

然后您可以在update() set()之前将其删除,并在set()之后再次设置

trace_vdelete('w', self.trace_id )
self.on_off.set(status["power"])
self.trace_id = self.on_off.trace("w",self.on_off_changed)

Tkinterbook(在effbot.org上):The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)