如何在matplotlib中检测双击事件?
import matplotlib.pyplot as plt
def onclick(event):
print event.button
fig = plt.figure()
connection_id = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
我遇到了一个问题,就是在这种情况下,双击会让 onclick()
这个处理函数被触发 三次。我猜是因为它同时接收了两个点击事件,还有一个额外的双击事件。请问我该怎么做才能让这个事件处理函数在双击时不被触发?或者,另外一种方法是,我该如何从事件实例中检测到双击事件,以便我可以忽略这些双击?
注意: button_release_event
这个事件没有这个问题,但我想在 button_press_event
时触发。
3 个回答
1
我在使用matplotlib 1.1的时候也遇到过同样的问题。当时没有“双击”的事件类型。所以我自己实现了这个功能。我要求两次点击之间的时间间隔必须小于0.5秒,否则程序就不做任何事情。用户可以根据自己的经验来调整这个设置。
import matplotlib.pyplot as plt
import time
fig = plt.figure()
one_click_trigger = False
time_first_click = 0
def mouseDoubleClick(event):
global one_click_trigger
global time_first_click
if one_click_trigger == False:
one_click_trigger = True
time_first_click = time.time()
return
else:
double_click_interval = time.time() - time_first_click
if double_click_interval > 0.5:
one_click_trigger = False
time_first_click = 0
return
print "Double click!"
fig.canvas.mpl_connect('button_press_event', mouseDoubleClick)
plt.show()
1
我能够通过以下方式检测到这个情况:
from gtk.gdk import BUTTON_PRESS, _2BUTTON_PRESS, _3BUTTON_PRESS
注意:双击和三击的名称前面有下划线,并不是因为它们是_保护的,而是为了避免属性名不能以数字开头的问题。你可以通过以下方式检查事件类型:
event.guiEvent.type
不过,我后来发现,如果你使用不同的后端,这个导入会导致异常(而且我只在使用'GTKAgg'后端时遇到这个问题)。所以现在我使用这样的结构:
from gtk.gdk import BUTTON_PRESS as singleclick
if plt.get_backend() == 'GTKAgg':
if hasattr(event, 'guiEvent') and event.guiEvent.type != singleclick:
# suppress double click event
return
如果有人有更好的解决方案,欢迎在这里分享。
16
当我使用的是matplotlib 1.1rc版本时,我无法捕捉到双击事件。后来,我为matplotlib 1.2写了代码,这个问题就解决了。
import matplotlib.pyplot as plt
fig = plt.figure()
def onclick(event):
if event.dblclick:
print event.button
connection_id = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()