Tkinter:如何设置'scale'值而不触发回调?

6 投票
2 回答
2895 浏览
提问于 2025-04-16 06:12

我有一个用Tkinter做的图形界面,其中有一个Scale对象。这个对象可以让用户调整一个值,我给它设置了一个回调函数(通过command这个参数),当用户改变滑块位置时就会执行这个函数。不过,有时候这个值是被外部修改的,所以我使用Scale.set()来设置滑块的位置。在这种情况下,我希望设置滑块,但触发回调函数,因为程序的其他部分已经知道这个值已经改变了。然而,我发现使用set()时,回调函数还是会被触发。

我想知道是否可以做到以下其中之一:

  1. 设置滑块的值而不触发回调函数。

  2. 在回调函数中区分是用户操作触发的,还是因为调用了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里没有特别的功能可以直接解决这个问题。不过,这其实是个很简单的问题:先去掉回调函数,设置好值,然后再加上回调函数。或者,你可以设置一个全局标志,在回调函数里检查这个标志。

当然也有其他解决方法,比如创建一个这个控件的子类,但这样做其实没有什么特别的好处。还是选择简单的解决方案,然后去处理更有趣的问题吧。

撰写回答