【发布时间】:2011-05-31 12:31:04
【问题描述】:
我一遍又一遍地遇到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
p.show() 阻塞,直到在事件处理程序中调用 p.close()。但是当第二次运行相同的代码时,它会越过p.show() 并打印出原来的s, [-1, -1]。
我已经阅读了关于是否可以或应该从同一程序多次调用 p.show() 的相互矛盾的信息。似乎它被设计为使用一次,并且只在脚本末尾使用一次。其他用例似乎以某种方式破坏了pyplot(状态机?)。
我尝试使用 p.draw() 和 p.ion() 和 p.ioff() 的组合,但无法获得我想要的行为(要么事情没有正确阻止,要么情节没有在正确的时间出现)。
我也很困惑事件处理程序如何能够在这里看到s,以及这是否是一种传入/传出信息的糟糕方式。如果我不使用像数组或列表这样的可变容器,我想要由事件处理程序设置的信息就会作为局部变量丢失。还有其他我错过的方法,GUI线程可以将信号传递回主线程吗?有没有办法在继续之前阻止来自事件处理程序的信号,而无需定期轮询或忙于等待?
所以我想最终我的主要问题是:
p.show() 是否有一个很好的替代品,可以满足我的要求(与p.show() 第一次的行为相同),或者这种代码是否需要完全重新思考/重写?
【问题讨论】:
标签: python events matplotlib blocking