我遇到了这个麻烦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
the p.show()
阻塞直到p.close()
在事件处理程序中调用。但是当第二次运行相同的代码时,它会超越p.show()
并打印原件s, [-1, -1]
.
我读过关于是否存在的相互矛盾的信息p.show()
可以或应该从同一程序多次调用。它似乎被设计为使用一次,并且仅在脚本末尾使用一次。其他用例似乎崩溃了pyplot
不知何故(状态机?)。
我尝试过使用组合p.draw()
and p.ion()
and p.ioff()
,但无法获得我想要的行为(要么事情没有正确阻止,要么情节没有在正确的时间出现)。
我也对事件处理程序如何看到感到困惑s
在这里,以及这是否是传入/传出信息的糟糕方式。如果我不使用数组或列表等可变容器,那么我想要由事件处理程序设置的信息就会作为局部变量丢失。是否有其他一些我错过的方法,GUI 线程可以将信号传递回主线程?有没有一种方法可以在继续之前阻止来自事件处理程序的信号,而无需定期轮询或忙等待?
所以我想最终我的主要问题是:
有没有一个简洁的替代品p.show()
,这就是我想要的(与p.show()
有第一次),或者这种代码是否需要完全重新思考/重写?