wx滑块绑定函数返回两次

时间:2014-07-28 06:44:29

标签: python events slider wxpython

我有一个滑块,我想取位置值(即; 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()

当滑块位置发生变化时,我看到两个相同的值打印到控制台,如图http://i.imgur.com/4nkcTtp.jpg?1

所示

为什么会这样?

2 个答案:

答案 0 :(得分:2)

如果您希望滑块更改事件仅触发一次,请使用以下:

self.slider.Bind(wx.EVT_COMMAND_SCROLL_THUMBTRACK, self.sliderUpdate)
self.slider.Bind(wx.EVT_COMMAND_SCROLL_CHANGED, self.sliderUpdate)

简单地说,当您使用鼠标更改滑块时会触发第一个滑块,而使用键盘更改滑块时会触发第二个滑块。就像其他答案所说的那样,wx.EVT_SLIDER会在更改滑块和释放鼠标时被触发。

请查看this,了解与滑块相关的各种事件的详细信息。

答案 1 :(得分:0)

每次更改值时都会获得一个事件,释放鼠标按钮时会有一个额外事件。如果这真的会大大减慢您的程序速度,您可以存储最后一个值并将其与当前值进行比较,并仅在该值发生更改时进行耗时的计算。

def slider_update(self, _event):
    value = self.slider.GetValue()
    if value != self.value:
        print value
        self.value = value