Tkinter:如何设置'scale'值而不触发回调?
我有一个用Tkinter做的图形界面,其中有一个Scale
对象。这个对象可以让用户调整一个值,我给它设置了一个回调函数(通过command
这个参数),当用户改变滑块位置时就会执行这个函数。不过,有时候这个值是被外部修改的,所以我使用Scale.set()
来设置滑块的位置。在这种情况下,我希望设置滑块,但不触发回调函数,因为程序的其他部分已经知道这个值已经改变了。然而,我发现使用set()
时,回调函数还是会被触发。
我想知道是否可以做到以下其中之一:
设置滑块的值而不触发回调函数。
在回调函数中区分是用户操作触发的,还是因为调用了
Scale.set()
。
谢谢。
2 个回答
6
我也遇到过同样的问题,不管是阻止回调函数执行,还是设置一个全局变量来检查回调状态,都没能解决我的问题。出于某种奇怪的原因,回调函数在我的代码运行完后还是会被调用。
尽管如此,我找到的解决办法很简单:我在小部件里用了一个变量,并通过这个变量的set
方法来设置值,而不是通过小部件的那个方法。
value = DoubleVar()
scale = Scale(master, variable=value, command=callback)
scale.pack()
scale.set(0) #<- this triggered the callback, no matter what I tried to stop it
value.set(0) #<- this seems to work like the previous line but without any callback
3
在Tkinter里没有特别的功能可以直接解决这个问题。不过,这其实是个很简单的问题:先去掉回调函数,设置好值,然后再加上回调函数。或者,你可以设置一个全局标志,在回调函数里检查这个标志。
当然也有其他解决方法,比如创建一个这个控件的子类,但这样做其实没有什么特别的好处。还是选择简单的解决方案,然后去处理更有趣的问题吧。