matplotlib未正确注册按键事件

时间:2015-08-20 22:42:26

标签: python matplotlib

我正在处理一些图片数据,点击图片中的不同元素会很有帮助。我希望有#34; shift-click"是注册光标位置的触发机制。

我写了一个&#34;点击&#34;做正确的事情的功能。但是,当我尝试将其升级到&#34; shift-click&#34;它根本不起作用。奇怪的是,它使用旧版本的Matplotlib(1.1,在Linux机器上运行,我的1.4.2,在Mac上运行,在我的同事计算机上工作。两者都在运行Python 2.7)< / p>

有谁知道发生了什么事?我完全没有想法。其他可能相关的信息是我最近安装了Seaborn(然后卸载了它)并升级了matplotlib(并尝试降级,但失败了)

编辑好的,我想我现在明白了。在开始正常工作之前,必须至少按下并释放一次换档。也许有一种解决方法。

import numpy as np
import matplotlib.pyplot as plt

def shiftclick(refimage, comment=None, eq=True):
    class EventHandler:
        def __init__(self, spotlist):
            fig.canvas.mpl_connect('button_press_event', self.onpress)
            fig.canvas.mpl_connect('key_press_event', self.on_key_press)
            fig.canvas.mpl_connect('key_release_event', self.on_key_release)
            self.shift_is_held = False
        def on_key_press(self, event):
            if event.key == 'shift':
               self.shift_is_held = True
        def on_key_release(self, event):
            if event.key == 'shift':
               self.shift_is_held = False
        def onpress(self, event):
            if event.inaxes!=ax:
                return
            if self.shift_is_held:
                xi, yi = (int(round(n)) for n in (event.xdata, event.ydata))
                value = im.get_array()[xi,yi]
                print xi, yi
                spotlist.append((xi, yi))
    im = plt.imshow(refimage, interpolation='nearest', origin='lower')

    plt.title('SHIFT-click on locations')
    fig = plt.gcf()
    ax = plt.gca()

    spotlist = []
    handler=EventHandler(spotlist)
    plt.show()
    return spotlist


def click(refimage, comment=None):
    class EventHandler:
        def __init__(self, spotlist):
            fig.canvas.mpl_connect('button_press_event', self.onpress)
        def onpress(self, event):
            if event.inaxes!=ax:
                return
            xi, yi = (int(round(n)) for n in (event.xdata, event.ydata))
            value = im.get_array()[xi,yi]
            print xi, yi
            spotlist.append((xi, yi))
    im = plt.imshow(refimage, interpolation='nearest', origin='lower')

    fig = plt.gcf()
    ax = plt.gca()

    spotlist = []
    handler=EventHandler(spotlist)
    plt.show()
    return spotlist

if __name__ == "__main__":
    a = np.random.random((100, 100))
    #this works
    click(a)
    #this doesn't work
    shiftclick(a)

1 个答案:

答案 0 :(得分:0)

好的,这是问题所在。升级Matplotlib后,MacOSX后端拒绝正确处理事件处理。它忽略了所有换档按钮。

使用TKAgg后端修复了问题,只要在尝试选择点之前按下shift至少一次。这仍然是不可取的。

使用Qt4Agg后端具有最佳行为。只要选择了窗口,它就会正确响应第一次移位。