如何以非阻塞方式从脚本中使用Pylab显示图像

6
我正在编写一些迭代的图像处理算法,并且希望在每次迭代后可视化生成的图像。这是Matlab中很容易实现的,而且不会阻塞主线程,但我在Python中很难做到。
在pylab中,show()函数会阻塞程序执行直到关闭窗口。我发现有些人使用ion()函数来解决这个问题,但在我的情况下它没有效果,例如:
pylab.ion()
img = pylab.imread('image.png')
pylab.imshow(img)
pylab.show()

仍然阻塞。我也看到有人说“使用draw而不是plot”可以解决这个问题。但是,我没有使用plot而是imshow/show,这里是否有什么我遗漏的东西?
另一方面,PIL也有一些显示函数,但它似乎会生成一个临时图像,然后用imagemagick显示它,所以我假设在这种方法中没有办法在同一个窗口中显示并更新图像。
我正在使用Ubuntu 10.10。
有人知道如何简单地做到这一点吗?还是我必须开始使用类似Qt的东西来拥有一个可以轻松更新的最小GUI?
2个回答

3
尝试使用pylab.draw()代替pylab.show()pylab.show()会启动一个Tk主循环,因此它是阻塞的。而pylab.draw()将强制在该点绘制图形。由于您正在使用pylab.ion(),因此已经创建了图形。但是在脚本的末尾,您必须放置pylab.show(),否则当脚本完成时,图形将被关闭,因为没有主循环。一个副作用是,在达到pylab.show()之前,您无法与图形交互。

谢谢,您的评论“使用pylab.ion(),图形已经创建”帮助我解决了问题。换句话说,在绘图之前这样做非常重要,据我所理解。 - Andre Holzner

2

您可以尝试将您的pylab内容进行线程处理:

import pylab
import threading

pylab.ion()
img = pylab.imread('map.png')

def create_show():
    pylab.imshow(img)
    pylab.show()

thread = threading.Thread(target=create_show)
thread.start()

#do your stuff

thread.join()

这对我不起作用。在“做你的事情”中,我等待按键,但这样做时线程不会结束。必须终止进程。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接