Как я могу обнаружить события двойного щелчка в matplotlib? - PullRequest
4 голосов
/ 15 июля 2011
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_press_event

Ответы [ 3 ]

11 голосов
/ 19 июля 2013

Когда у меня была версия 1.1rc matplotlib, я не мог перехватить событие 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 голос
/ 20 июля 2017

Я столкнулся с той же проблемой при использовании 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()
1 голос
/ 15 июля 2011

Мне удалось обнаружить случай с помощью

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

Если у кого-нибудь есть более чистое решение, не стесняйтесь добавить его сюда.

...