如何在matplotlib中检测双击事件?

8 投票
3 回答
9995 浏览
提问于 2025-04-16 21:35
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()

撰写回答