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

时间:2011-07-15 05:58:00

标签: python events double-click 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 个答案:

答案 0 :(得分:11)

当我有matplotlib版本1.1rc时,我无法捕获dblclick事件。 后来,我为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()

答案 1 :(得分: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

如果有人有更清洁的解决方案,请随时在此处添加。

答案 2 :(得分:1)

我在使用matplotlib 1.1时遇到了同样的问题。 没有'dblclick'事件类型。所以我自己实现了它。我要求两次点击之间的时间间隔必须小于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()