【问题标题】:wx slider binding function returns twicewx滑块绑定函数返回两次
【发布时间】:2014-09-19 07:35:38
【问题描述】:

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

为什么会这样?

【问题讨论】:

    标签: python events slider wxpython


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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,了解与滑块相关的各种事件的详细信息。

      【讨论】:

        猜你喜欢
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-26
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多