2011-07-15 45 views
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()處理程序三個次的問題。我猜想它正在接收這些點擊和另外一個雙擊事件。我怎樣才能改變這種行爲,以便雙擊事件不會觸發事件處理程序?或者,或者,我如何從事件實例中檢測它們,以便我可以忽略這些雙擊?如何檢測matplotlib中的雙擊事件?

注:button_release_event沒有這個問題,但我想火上button_press_event

回答

9

當我有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() 
+0

感謝您的貢獻,這是一個更好的解決方案比我的,所以我會改變接受的答案:) – wim

+0

注意'event.dblclick'屬性是*不*活躍''button_release_event'',只爲''button_press_event''。或者至少,我無法使用發佈事件。 – dthor

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 

如果任何人有一個清晰的解決方案,隨意添加在這裏。

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()