2016-07-29 2 views
0

У меня есть виджет wx.Slider, связанный с обработчиком событий. Когда пользователь перемещает слайдер, выполняется какой-то процесс. Однако, поскольку процесс может занять до 3 секунд, я не хочу, чтобы событие срабатывало непрерывно, когда пользователь перемещает ползунок. Вместо этого я хочу, чтобы событие срабатывало только в том случае, если пользователь перестает перемещать слайдер на некоторое время (скажем, 2 секунды). Я пробовал использовать time.time() с while -loop (см. Код ниже), но это не сработало, потому что событие все равно будет срабатывать многократно - это просто, что увольнение затянулось. Любая идея/указатель/предложение были бы весьма полезны.wxpython wx.Slider: как запустить событие только в том случае, если пользователь делает паузу в течение некоторого заданного времени

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() 

ответ

1

Задержка с time.sleep будет блокировать ваш графический интерфейс. Вместо этого используйте 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 
+0

Спасибо! Он делает именно то, что я хочу. – Alex