我在 Tkinter 中使用 Scale 小部件来控制对象在另一个程序中的位置。用户既可以在 GUI 中移动 slider ,也可以直接从外部程序中移动对象。我希望 slider 值始终显示对象的当前位置。我遇到的问题是,移动 slider 和使用 set
方法以编程方式设置 slider 都会调用 Scale 小部件的回调。我只想在物理移动时调用它。
到目前为止我尝试了什么:
遵循 this 的建议回答,我尝试使用标志并在调用 set
之前禁用回调,但这在我的情况下并不奏效。设置和读取对象的位置存在时间延迟,我认为这是导致问题的原因(我构建了一个玩具示例,其中 slider 刚刚连接到另一个 slider ,并且标志解决方案有效,但它不起作用对于我的实际应用程序)。我还使用 after
函数定期检查物理对象是否移动。我不确定这是否是最好的方法或者是否会影响任何东西(它可能允许标志在部分代码中处于错误状态)。
我想我必须尝试将小部件子类化的建议,然后制作我自己的 set
方法版本,该方法设置一个值,但不调用回调。不过,我不确定该怎么做,并且通过浏览小部件的源代码,我不太清楚这一切发生在哪里。任何帮助将不胜感激,谢谢!
最佳答案
我遇到了同样的问题,既没有禁止回调也没有设置全局变量来检查回调状态对我有用,出于某种不明原因,在我的代码运行完成后回调一直被调用。
尽管如此,对我有用的解决方案很简单:我在小部件中使用了一个变量,并使用变量的 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
关于python - Tkinter,Python - 在不触发回调的情况下更改 slider 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27910363/