2016-07-29 68 views
0

Ich habe ein wx.Slider Widget, das an einen Ereignishandler gebunden ist. Wenn ein Benutzer den Schieberegler bewegt, wird ein bestimmter Prozess ausgeführt. Da der Vorgang bis zu 3 Sekunden dauern kann, möchte ich jedoch nicht, dass das Ereignis kontinuierlich ausgelöst wird, wenn der Benutzer den Schieberegler bewegt. Stattdessen möchte ich, dass das Ereignis nur dann ausgelöst wird, wenn der Benutzer den Schieberegler für eine bestimmte Zeit (z. B. 2 Sekunden) nicht mehr bewegt. Ich versuchte mit time.time() mit einem while -loop (siehe Code unten), aber es hat nicht funktioniert, weil das Ereignis immer noch wiederholt werden würde - es ist nur, dass die Zündung verzögert wurde. Jede Idee/Zeiger/Vorschlag würde sehr geschätzt werden.wxpython wx.Slider: wie ein Ereignis nur ausgelöst wird, wenn ein Benutzer für eine bestimmte Zeit pausiert

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

Antwort

1

Aufschieben mit time.sleep Ihre GUI blockieren. Verwenden Sie stattdessen wx.CallLater, was im folgenden Beispiel das verzögerte Ereignis auslöst, bis es erneut gestartet wird.

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

Danke! Es macht genau das, was ich will. – Alex