wxpython wx.Slider:如何仅在用户暂停某个预定时间时触发事件

wxpython wx.Slider: how to fire an event only if a user pauses for some predetermined time

我有一个绑定到事件处理程序的 wx.Slider 小部件。当用户移动滑块时,某些进程将 运行。但是,由于该过程最多可能需要 3 秒才能到达 运行,我不希望事件在用户移动滑块时连续触发。相反,我希望事件仅在用户停止移动滑块一段时间(比如 2 秒)时触发。我尝试将 time.time()while 循环一起使用(请参阅下面的代码),但它不起作用,因为该事件仍会重复触发——只是触发被延迟了。任何 idea/pointer/suggestion 将不胜感激。

import wx
import time

class Example(wx.Frame):

    def __init__(self, *args, **kw):
        super(Example, self).__init__(*args, **kw) 
        self.InitUI()

    def InitUI(self):   
        pnl = wx.Panel(self)
        sld = wx.Slider(pnl, value=200, minValue=150, maxValue=500, pos=(20, 20), 
                        size=(250, -1), style=wx.SL_HORIZONTAL)        
        self.counter = 0
        sld.Bind(wx.EVT_SCROLL, self.OnSliderScroll)

        self.txt = wx.StaticText(pnl, label='200', pos=(20, 90))               

        self.SetSize((290, 200))
        self.SetTitle('wx.Slider')
        self.Centre()
        self.Show(True)    

    def OnSliderScroll(self, e):        
        now = time.time()
        future = now + 2
        while time.time() < future:
            pass
        #substitute for the actual process.
        self.counter += 1
        print self.counter


def main():    
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()   

延迟 time.sleep 将阻止您的 GUI。请改用 wx.CallLater,在下面的示例中,它将触发延迟事件,直到它再次重新启动。

    def InitUi(self):
        # ...

        # Add a delay timer, set it up and stop it
        self.delay_slider_evt = wx.CallLater(2000, self.delayed_event)
        self.delay_slider_evt.Stop()

    def OnSliderScroll(self, e):
        # if delay timer does not run, start it, either restart it
        if not self.delay_slider_evt.IsRunning():
            self.delay_slider_evt.Start(2000)
        else:
            self.delay_slider_evt.Restart(2000)

    def delayed_event(self):
        #substitute for the actual delayed process.
        self.counter += 1
        print self.counter