我正在使用Tkinter中的Scale小部件来控制另一个程序中对象的位置。用户既可以在GUI中移动滑块,也可以直接从外部程序移动对象。我希望滑块值始终显示对象的当前位置。我遇到的问题是,移动滑块和以set
方法以编程方式设置滑块都会调用Scale小部件的回调。我只想在物理移动时调用它。
到目前为止我尝试过:
根据this回答的建议,我尝试使用标记并在调用set
之前禁用回调,但这在我的情况下并不常用。设置和读取对象的位置有一个时间延迟,我认为这是导致问题的原因(我建立了一个玩具示例,其中滑块刚刚连接到另一个滑块,并且标志解决方案有效,但它不起作用对于我的真实应用)。我还使用after
函数定期检查物理对象是否被移动。我不确定这是否是最好的方法,或者是否会影响任何事情(可能是在部分代码中允许标志处于错误的状态)。
我想我必须尝试子窗口小部件的建议,然后制作我自己的set
方法设置一个值,但不调用回调。我不知道如何做到这一点,并且通过浏览小部件的源代码,不太清楚这一切发生的地方。非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
我遇到了同样的问题,既没有禁止回调,也没有设置全局变量来检查回调状态对我有用,因为某些晦涩的原因,在我的代码运行完后,回调一直被调用。
尽管如此,为我工作的解决方案却很简单:我在小部件中使用了一个变量,并使用变量的set
方法而不是小部件中的一个来设置值。
value = DoubleVar()
scale = Scale(master, variable=value, command=callback)
scale.pack()
scale.set(0) #<- this triggers the callback, no matter what I tried to stop it
value.set(0) #<- this works like the previous line but without any callback
答案 1 :(得分:-1)
def program_move():
inhibit_callback = True
slider.value = #your value here
def callback(event, *args):
If inhibit_callback:
inhibit_callback = False
return
else:
#whatever you were going to do
并且我认为这应该允许回调在用户触发回调时正常工作,但是当程序触发它时,它应该在触发回调后立即中断并重置其自己的标志。