Python - matplotlib.pyplot.imshow在if/while中不起作用

0 投票
2 回答
3029 浏览
提问于 2025-04-18 03:22

我正在尝试在一个循环里用imshow显示一张图片(一个N*P的numpy数组),但似乎不太成功。

当我直接用“plt.imshow(image,cmap='gray')”而不缩进时,它工作得很好。

但是,当我试着在一个循环里这样使用时:

continue=True
while continue:
    plt.imshow(image,cmap='gray')
    continue=input()

或者

i=0
while i<10:
    plt.imshow(image,cmap='gray')
    i+=1

pyplot窗口就会卡住,Python也崩溃了(用if也是同样的问题)。

我不明白为什么会这样,有人知道吗?非常感谢! :)

补充:我在我的程序里尝试这样使用它:

import matplotlib.pyplot as plt
import numpy as np
import PIL.Image as im

image=np.array(im.open("Blabla.jpg").convert('L')).astype(np.float32)

plt.imshow(image,cmap='gray') #This works -> ONLY when there is not a while after

keepGoin = True #But this doesn't
while keepGoin:
    plt.imshow(image,cmap='gray')
    keepGoin=input()

补充2:

我犯了个错误:似乎当使用while或if时,imshow会暂停,即使while循环就在imshow之后。而当while循环结束后,图片才会显示出来。也许使用这种循环会让进程暂停?

所以我尝试用一个辅助函数来在while循环“外部”显示图片,但也不行,结果是一样的:在while循环期间,pyplot窗口卡住,图片在循环结束后才显示。

补充3:

经过更多尝试后,我很确定问题不在于从while调用imshow,而是循环暂停了pyplot的执行,即使是在循环之前调用imshow(如果我先调用imshow再用循环,pyplot窗口会一直卡到循环结束)。

根据我最近的研究,plt.pause可能会帮我,但我尝试这个时出现了错误。

2 个回答

0

如果你在使用Spider这个工具,比较简单的方法是设置让它在控制台显示图片,因为在控制台里图片不会卡住。要设置Spider在控制台显示图片,你可以按照以下步骤操作:进入偏好设置 -> 选择Python控制台 -> 找到图形 -> 输出图形 -> 在这里选择“内联”而不是“自动”。

0

这里有一些观察结果,可能会帮助你调试。下面的代码和说明只适用于 Python 2.x

使用下面的代码时,你需要在启动程序的控制台中输入 TrueFalse,这样程序在第一次显示后才不会崩溃,因为 input() 需要某种输入,如果你不输入任何东西,它就会报 EOF 错误。

import  matplotlib.pyplot as plt
import numpy as np
import PIL.Image as im

image=np.array(im.open("Blabla.jpg").convert('L')).astype(np.float32)

plt.ion()
plt.imshow(image,cmap='gray')

keepGoin = True #But this doesn't
while keepGoin:
    plt.imshow(image,cmap='gray')
    keepGoin=input()

如果你把它改成 raw_input,那么在遇到 EOF 时就不会崩溃,但如果不输入任何内容,它还是会结束。不过,如果把循环改成不依赖输入的方式,它会暂停,直到我在终端按下 Enter 键。

while True:
    plt.imshow(image,cmap='gray')
    raw_input()

撰写回答