我有一个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,我现在不想要。
答案 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)