如何以非阻塞方式从脚本中用Pylab显示图像
我正在写一个迭代的图像处理算法在一个脚本里(我不想用iPython),我想在每次迭代后可视化生成的图像。在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 个回答
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()
3
试试用 pylab.draw()
来代替 pylab.show()
。
pylab.show()
会启动一个 Tk 的主循环,这样会让程序停下来等着。而 pylab.draw()
则是在那一刻强制更新图形。因为你已经使用了 pylab.ion()
,所以图形已经创建好了。但在脚本的最后,你必须加上 pylab.show()
,否则当脚本结束时图形会关闭,因为没有主循环。一个副作用是,在你调用 pylab.show()
之前,你无法与图形进行互动。