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

问题描述 投票:0回答:3
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

上开火
python events double-click matplotlib
3个回答
16
投票

当我有 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
投票

我能够使用

检测到此案例

from gtk.gdk import BUTTON_PRESS, _2BUTTON_PRESS. _3BUTTON_PRESS

注意:在双击和三次单击枚举类型上使用下划线的原因并不是它们受到_protected,而是为了避免不允许拥有以数字开头的属性的问题。您可以通过以下方式检查事件类型:

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

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


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()
© www.soinside.com 2019 - 2024. All rights reserved.