written on windows 7 using python 3.6.2, should work on any platform,
but not tested on Linux or OS-X
I've been doing a lot of playing around with wxpython for the past few weeks.
I needed a reliable routine that could distinguish between single and double
mouse clicks.
There is a good timer example in the demos that come with the wxpython phoenix
tarball, and I used this as the basis for this routine.
Here's how it works:
when a EVT_LEFT_DOWN event is triggered, the timer is started
if another left click down event is triggered (recognized as a EVT_LEFT_DCLICK),
the timer is stopped because, it's no longer needed, this is a double click.
After 250ms EVT_TIMER event occurs, that means that the full 250ms elapsed and the
event must be a single click. The timer is stopped and right click can be processed.
Here's the code:
but not tested on Linux or OS-X
I've been doing a lot of playing around with wxpython for the past few weeks.
I needed a reliable routine that could distinguish between single and double
mouse clicks.
There is a good timer example in the demos that come with the wxpython phoenix
tarball, and I used this as the basis for this routine.
Here's how it works:
- wx.EVT_LEFT_DOWN is bound to on_left_down
- wx.EVT_LEFT_DCLICK is bound to on_dbl_click
- wx.EVT_TIMER is bound to single_click
when a EVT_LEFT_DOWN event is triggered, the timer is started
if another left click down event is triggered (recognized as a EVT_LEFT_DCLICK),
the timer is stopped because, it's no longer needed, this is a double click.
After 250ms EVT_TIMER event occurs, that means that the full 250ms elapsed and the
event must be a single click. The timer is stopped and right click can be processed.
Here's the code:
# # Single, Double click recognition for wxpython using # a timer event -- should be very reliable -- # import wx class TrySingleDouble(wx.Frame): def __init__(self, title): wx.Frame.__init__(self, None, title=title, size=(350, 200)) # Delay time of 500ms, is what's used by Microsoft, but this is too long # and can be a lot shorter (especially if used for gaming). Here I # use 300 ms. self.dbl_clk_delay = 250 self.Bind(wx.EVT_LEFT_DOWN, self.on_left_down) self.Bind(wx.EVT_LEFT_DCLICK, self.on_dbl_click) self.Bind(wx.EVT_TIMER, self.single_click) def on_dbl_click(self, e): self.stop_timer() print('Double click') def on_left_down(self, e): self.start_timer() def start_timer(self): self.timer1 = wx.Timer(self) self.timer1.Start(self.dbl_clk_delay) def stop_timer(self): self.timer1.Stop() del self.timer1 def single_click(self, e): self.stop_timer() print('Single_click') def tst_app(): app = wx.App(redirect=True) win = TrySingleDouble("Single-Double Click Test") win.Show() app.MainLoop() if __name__ == '__main__': tst_app()