在matplotlib中阻止并继续

时间:2016-02-28 02:22:39

标签: python user-interface events matplotlib blocking

我有一个脚本可以绘制一些图像:

from matplotlib import pyplot as plt
from matplotlib import image as mpimg

(...)

fig = plt.figure()
ax = fig.add_subplot(111)

(...)

for img in images:
    imgdata = mpimg.imread(img)
    ax.imshow(imgdata)
    plt.show(block=True)

不幸的是,阻止GUI并等待fig.show()的用户输入似乎是不可能的。只是plt.show()阻止......所以我必须使用plt.show解决方案?

此外,我正在收听这样的用户事件:

cid = fig.canvas.mpl_connect('key_press_event', on_key_press)

def on_key_press(event):
    if event.key == "n":
        ax.cla()
        plt.show(block=False)

我的意图是听'n'(比如'next')然后继续for循环,因此加载下一个图像数据并绘制它,再次等待用户输入等等......

然而,第二次调用show()plt.show(block=False))更新图像(因此ax的数据被清除)但锁定未被释放 - for循环不会继续。我怎么能实现这种行为?

编辑:我需要event.xdata的{​​{1}},event.ydataevent.xevent.y值,因此执行“ hack“使用类似matplotlib的东西,因此让python在控制台中等待用户输入(并且每次使用带有input()的matplotlib)都无法解决我的问题。

1 个答案:

答案 0 :(得分:0)

我不太确定你想要什么行为,但是像

那样
def set_up_figure():
    fig, ax = plt.subplots()
    fig.canvas.mpl_connect(..)
    fig.canvas.mpl_connect(..)
    return fig, ax

for img in images:
    fig, ax = set_up_figure()
    ax.imshow(img)
    plt.show(block=True)

可能有用。

plt.show做什么(fig.show没有)是启动GUI事件循环,最后是用户输入,通过 对其进行洗牌回调机制,将事件交给mpl回调机制,后者实际上运行你的功能。