Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 滑块:如何仅在用户暂停某个预定时间时触发事件_Python_Events_Event Handling_Slider_Wxpython - Fatal编程技术网

Python 滑块:如何仅在用户暂停某个预定时间时触发事件

Python 滑块:如何仅在用户暂停某个预定时间时触发事件,python,events,event-handling,slider,wxpython,Python,Events,Event Handling,Slider,Wxpython,我有一个绑定到事件处理程序的wx.Slider小部件。当用户移动滑块时,某些进程将运行。但是,由于运行该过程可能需要3秒钟,因此我不希望在用户移动滑块时持续触发事件。相反,我希望只有当用户停止移动滑块一段时间(例如,2秒)时才会触发事件。我尝试将time.time()与while-循环一起使用(请参见下面的代码),但它不起作用,因为事件仍然会重复触发——只是触发延迟了。如有任何想法/建议,将不胜感激 import wx import time class Example(wx.Frame):

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

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()   
导入wx
导入时间
类示例(wx.Frame):
定义初始值(自,*args,**kw):
超级(示例,自我)。\uuuuu初始值(*args,**kw)
self.InitUI()
def InitUI(self):
pnl=wx.面板(自)
sld=wx.滑块(pnl,值=200,最小值=150,最大值=500,位置=(20,20),
大小=(250,-1),样式=wx.SL_水平)
self.counter=0
sld.Bind(wx.EVT_滚动,self.OnSliderScroll)
self.txt=wx.StaticText(pnl,label='200',pos=(20,90))
自我设置大小((290200))
self.SetTitle('wx.Slider')
自我中心()
自我展示(真实)
滑环上的def(自身,e):
now=time.time()
未来=现在+2
而time.time()<未来:
通过
#代替实际过程。
self.counter+=1
打印自动计数器
def main():
ex=wx.App()
示例(无)
例如MainLoop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

延迟
时间。睡眠将阻塞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

谢谢这正是我想要的。