2016-07-29 4 views
0

私はwx.Sliderウィジェットをイベントハンドラにバインドしています。ユーザーがスライダーを動かすと、何らかのプロセスが実行されます。ただし、プロセスの実行には最大3秒かかることがあるため、ユーザーがスライダーを動かすとイベントが連続的に発生することはありません。代わりに、ユーザーがスライダーの移動をある時間(たとえば2秒)停止した場合にのみ、イベントを発生させます。私はwhile -loop(下のコードを参照)でtime.time()を使ってみましたが、イベントが繰り返し発生するため、動作しませんでした。任意のアイデア/ポインタ/提案は非常に高く評価されるだろう。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を使用すると、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 
+0

ありがとうございます!それはまさに私が望むものです。 – Alex

関連する問題