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
谢谢这正是我想要的。