Python pyplot:处理双击事件也会捕获第一次单击事件

时间:2018-11-29 07:34:36

标签: python-3.x matplotlib

我写了一个处理两种事件的代码-鼠标单击和双击。 问题在于,每当用户双击鼠标时,它也会触发一次单击,然后触发双击事件。

我希望双击将仅触发一个事件!双击事件。

有什么建议吗?

谢谢

2 个答案:

答案 0 :(得分:3)

通过@ThomasKühn链接,答案是创建一个软件反跳。有几种解决方法,解决方案可能取决于您的应用程序(您使用的是GUI,后端是什么,等等。)为了尽可能地与众不同,我已经使用一个一次性线程实现了我的解决方案{ {3}}。

import threading
import matplotlib.pyplot as plt

DEBOUNCE_DUR = 0.25
t = None


def on_press(event):
    global t
    if t is None:
        t = threading.Timer(DEBOUNCE_DUR, on_singleclick, [event])
        t.start()
    if event.dblclick:
        t.cancel()
        on_dblclick(event)


def on_dblclick(event):
    global t
    print("You double-clicked", event.button, event.xdata, event.ydata)
    t = None


def on_singleclick(event):
    global t
    print("You single-clicked", event.button, event.xdata, event.ydata)
    t = None


fig, ax = plt.subplots()
cid = fig.canvas.mpl_connect('button_press_event', on_press)

plt.show()

答案 1 :(得分:0)

当我在Tkinter中寻找嵌入式Matplotlib画布的解决方案时,我想出了另一种解决方案(因为在这种情况下,可接受的答案不能很好地起作用),这里是一个代码缩小的代码,有望帮助其他苦苦挣扎的人tkinter和matplotlib:

def _on_click_debounce(self,event):
    if self._job is None:
        self._job = root.after(self.DEBOUNCE_DUR, lambda: self._on_click(event))
    if event.dblclick:
        root.after_cancel(self._job)
        self._job = None
        self._on_dblclick(event)

def _on_dblclick(self,event):
    print('dblclick!')

def _on_click(self,event):
    print('singleclick!')
    self._job = None

函数_on_click_debounce移交给了matplotlib事件处理(fig.canvas.mpl_connect('button_press_event', _on_click_debounce)),而root只是tkinter的全局root = tkinter.Tk()