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()
