(python)matplotlib pyplot show()..阻塞与否?

wim*_*wim 6 python events matplotlib blocking

show()一遍又一遍地遇到这个麻烦,我确信我做错了但不确定做出我想要的'正确'方法.

并且[我认为]我想要的是在主线程中阻塞直到GUI线程中发生事件的某种方式,这样的事情第一次起作用:

from matplotlib import pyplot as p
from scipy import rand

im = (255*rand(480,640)).astype('uint8')
fig = p.figure()
ax = fig.add_subplot(111)
ax.imshow(im)

# just any mutable container for storing a click
s = [-1, -1]

def onclick(event):
  if event.xdata is not None and event.ydata is not None:
    s[0] = event.xdata
    s[1] = event.ydata
    p.close()

cid = fig.canvas.mpl_connect('button_press_event', onclick)
p.show()
print s
Run Code Online (Sandbox Code Playgroud)

p.show()块,直到p.close()被调用的事件处理程序.但是当第二次运行相同的代码时,它会越过p.show()并打印原始代码s, [-1, -1].

我已阅读有关是否p.show()可以或应该从同一程序中多次调用的相互矛盾的信息.它似乎被设计为使用一次,并且只在脚本结束时使用一次.其他用例似乎以pyplot某种方式破坏(状态机?).

我试图使用p.draw()and p.ion()和的组合p.ioff(),但是无法获得我想要的行为(要么事情没有正确阻挡,要么情节没有出现在正确的时间).

我也很困惑事件处理程序如何能够s在这里看到,以及这是否是一种传递/传出信息的糟糕方式.如果我不使用像数组或列表这样的可变容器,那么我想要的事件处理程序设置的信息就会作为局部变量丢失.是否有一些我错过的其他方法,GUI线程可以将信号传递回主线程?有没有办法在继续之前阻止来自事件处理程序的信号,而不是定期轮询或忙等待?

所以我想最终我的主要问题是:

是否有一个简洁的替代品p.show(),它做我想要的(与p.show()第一次相同的行为),或者这种代码是否需要完全重新思考/重写?

wim*_*wim 1

我今天能够解决我的问题。如果其他人有兴趣改变 的行为show(),请继续阅读以了解如何做到这一点:

我注意到这一段标题为“多次调用以显示matplotlib 网页的新增功能部分的支持”:

一个长期存在的请求是支持对 show() 的多次调用。这很困难,因为很难在操作系统、用户界面工具包和版本之间获得一致的行为。Eric Firing 在跨后端合理化显示方面做了很多工作,其期望的行为是使显示提升所有新创建的数字并阻止执行直到它们关闭。重复调用 show 应该会产生自上次调用以来新创建的数字。Eric 对他有权访问的用户界面工具包以及版本和平台进行了大量测试,但不可能对所有这些进行测试,因此请向邮件列表和错误跟踪器报告问题。

这是版本的“新增内容” 1.0.1,在撰写本文时,突触中的版本仍然可用0.99.3。我能够从源代码下载并构建v1.0.1。我还需要满足依赖关系的其他软件包是libfreetype6-dev tk-dev tk8.5-dev tcl8.5-dev python-gtk2-dev.

现在matplotlib.__version__ == 1.0.1,以下代码阻止了我的预期:

import matplotlib.pyplot as p
from scipy import eye
p.imshow(eye(3))
p.show()
print 'a' 
p.imshow(eye(6))
p.show()
print 'b' 
p.imshow(eye(9))
p.show()
print 'c' 
Run Code Online (Sandbox Code Playgroud)