wxpython wx.Slider:如何仅在用户暂停某个预定时间时触发事件
wxpython wx.Slider: how to fire an event only if a user pauses for some predetermined time
我有一个绑定到事件处理程序的 wx.Slider
小部件。当用户移动滑块时,某些进程将 运行。但是,由于该过程最多可能需要 3 秒才能到达 运行,我不希望事件在用户移动滑块时连续触发。相反,我希望事件仅在用户停止移动滑块一段时间(比如 2 秒)时触发。我尝试将 time.time()
与 while
循环一起使用(请参阅下面的代码),但它不起作用,因为该事件仍会重复触发——只是触发被延迟了。任何 idea/pointer/suggestion 将不胜感激。
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()
延迟 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
我有一个绑定到事件处理程序的 wx.Slider
小部件。当用户移动滑块时,某些进程将 运行。但是,由于该过程最多可能需要 3 秒才能到达 运行,我不希望事件在用户移动滑块时连续触发。相反,我希望事件仅在用户停止移动滑块一段时间(比如 2 秒)时触发。我尝试将 time.time()
与 while
循环一起使用(请参阅下面的代码),但它不起作用,因为该事件仍会重复触发——只是触发被延迟了。任何 idea/pointer/suggestion 将不胜感激。
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()
延迟 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