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()
相同的行为),或者这种代码需要完全重新考虑/重写?