我有一个脚本可以绘制一些图像:
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.ydata
,event.x
,event.y
值,因此执行“ hack“使用类似matplotlib
的东西,因此让python在控制台中等待用户输入(并且每次使用带有input()
的matplotlib)都无法解决我的问题。
答案 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回调机制,后者实际上运行你的功能。