【问题标题】:How can I detect double click events in matplotlib?如何检测 matplotlib 中的双击事件?
【发布时间】:2011-10-05 21:42:22
【问题描述】:
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


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      当我有 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()
      

      【讨论】:

      • 感谢您的贡献,这是比我更好的解决方案,所以我将更改接受的答案:)
      • 请注意event.dblclick 属性对于'button_release_event'激活的,仅对'button_press_event' 有效。或者至少,我无法让它与发布事件一起使用。
      【解决方案3】:

      我在使用 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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 2014-04-20
        • 2011-05-18
        • 2015-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        相关资源
        最近更新 更多