wx滑块绑定函数返回两次
我有一个滑块,我想从中获取位置值(比如:1、2、3等等),然后在另一个函数中使用这个值。但是,每当滑块的位置改变时,它似乎会返回两次相同的值;这导致我的另一个函数也运行了两次,结果让一切变得很慢。
这里有个简单的例子来说明我的意思。
import wx
class windowClass(wx.Frame):
def __init__(self, *args, **kwargs):
super(windowClass, self).__init__(*args, **kwargs)
self.basicGUI()
def basicGUI(self):
panel = wx.Panel(self)
self.slider = wx.Slider(panel, -1, 2, 0, 4, pos=(10,25), size=(250,-1), style=wx.SL_AUTOTICKS | wx.SL_LABELS)
sliderText = wx.StaticText(panel, -1, 'Slider', (8,8))
self.Bind(wx.EVT_SLIDER, self.sliderUpdate)
self.SetTitle('Sliders Window!')
self.Show(True)
def sliderUpdate(self, event):
value = self.slider.GetValue()
print value
def main():
app = wx.App()
windowClass(None)
app.MainLoop()
main()
当滑块位置改变时,我在控制台上看到打印了两个相同的值,正如图片所示 https://i.stack.imgur.com/nTitP.jpg
这是为什么呢?
2 个回答
0
每当值发生变化时,你会收到一个事件,当你松开鼠标按钮时,还会收到一个额外的事件。如果这些事件让你的程序变得很慢,你可以保存上一个值,然后和当前值进行比较,只有当值发生变化时才进行那些耗时的计算。
def slider_update(self, _event):
value = self.slider.GetValue()
if value != self.value:
print value
self.value = value
4
如果你想让滑块的变化事件只触发一次,可以使用以下代码:
self.slider.Bind(wx.EVT_COMMAND_SCROLL_THUMBTRACK, self.sliderUpdate)
self.slider.Bind(wx.EVT_COMMAND_SCROLL_CHANGED, self.sliderUpdate)
简单来说,第一个事件是在你用鼠标改变滑块时触发的,第二个事件是在你用键盘改变滑块时触发的。就像其他回答说的,wx.EVT_SLIDER事件在你改变滑块和松开鼠标时都会触发。
想了解更多关于滑块的各种事件,可以查看这个链接。