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

时间:2011-05-05 11:10:10

标签: python image matplotlib

我在脚本中编写了一些迭代图像处理算法 (我不想使用iPython),我希望可视化每次迭代后生成的图像。在Matlab中很容易做到,不会阻塞主线程,但我很难在Python中做到这一点。

在pylab中, show()函数正在阻塞,我需要关闭窗口以继续执行我的脚本。我已经看到有些人使用了ion()函数,但在我的情况下没有效果,例如:

pylab.ion()
img = pylab.imread('image.png')
pylab.imshow(img)
pylab.show()

仍在阻止。我也看到有人说“使用绘画代替情节”可以解决这个问题。但是,我不是在使用情节,而是使用imshow / show,这里有什么东西我不知道吗?

另一方面, PIL 也有一些显示功能,但它似乎生成一个临时图像,然后用imagemagick显示它,所以我假设这里没有办法显示图像并使用此方法在同一窗口中更新它。

我使用的是Ubuntu 10.10。

有没有人知道如何简单地完成它,或者我是否必须开始使用像Qt这样的东西来拥有一个我可以轻松更新的最小GUI?

2 个答案:

答案 0 :(得分:3)

尝试使用pylab.draw()代替pylab.show()

pylab.show()将启动一个Tk主循环,因此它会阻塞。而pylab.draw()将强制在那一点绘制数字。由于您使用pylab.ion(),因此已创建数字。但是在脚本结束时你必须放置一个pylab.show(),否则当脚本完成时将关闭数字,因为没有主循环。一个副作用是,在到达pylab.show()之前,您无法与数字交互。

答案 1 :(得分: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()