Tkinter,Python - 更改滑块值而不触发回调

时间:2015-01-12 20:38:18

标签: python python-2.7 tkinter slider

我正在使用Tkinter中的Scale小部件来控制另一个程序中对象的位置。用户既可以在GUI中移动滑块,也可以直接从外部程序移动对象。我希望滑块值始终显示对象的当前位置。我遇到的问题是,移动滑块和以set方法以编程方式设置滑块都会调用Scale小部件的回调。我只想在物理移动时调用它。

到目前为止我尝试过:

根据this回答的建议,我尝试使用标记并在调用set之前禁用回调,但这在我的情况下并不常用。设置和读取对象的位置有一个时间延迟,我认为这是导致问题的原因(我建立了一个玩具示例,其中滑块刚刚连接到另一个滑块,并且标志解决方案有效,但它不起作用对于我的真实应用)。我还使用after函数定期检查物理对象是否被移动。我不确定这是否是最好的方法,或者是否会影响任何事情(可能是在部分代码中允许标志处于错误的状态)。

我想我必须尝试子窗口小部件的建议,然后制作我自己的set方法设置一个值,但不调用回调。我不知道如何做到这一点,并且通过浏览小部件的源代码,不太清楚这一切发生的地方。非常感谢任何帮助,谢谢!

2 个答案:

答案 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

并且我认为这应该允许回调在用户触发回调时正常工作,但是当程序触发它时,它应该在触发回调后立即中断并重置其自己的标志。