wx滑块绑定函数返回两次

1 投票
2 回答
936 浏览
提问于 2025-04-18 15:00

我有一个滑块,我想从中获取位置值(比如: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事件在你改变滑块和松开鼠标时都会触发。

想了解更多关于滑块的各种事件,可以查看这个链接

撰写回答