我写了一个处理两种事件的代码-鼠标单击和双击。 问题在于,每当用户双击鼠标时,它也会触发一次单击,然后触发双击事件。
我希望双击将仅触发一个事件!双击事件。
有什么建议吗?
谢谢
答案 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()