Me he encontrado con este problema con show()
una y otra vez, y estoy seguro de que estoy haciendo algo mal pero no estoy seguro de la forma "correcta" de hacer lo que quiero.(python) matplotlib pyplot show() .. bloqueando o no?
Y [creo] lo que quiero es una manera de bloquear en el hilo principal hasta que ocurre un evento en el hilo GUI, algo como esto funciona la primera vez:
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
los p.show()
bloques hasta p.close()
se llama en el controlador de eventos. Pero cuando ejecuta el mismo código la segunda vez, pasa por el p.show()
e imprime ese original s, [-1, -1]
.
He leído información contradictoria sobre si p.show()
se puede o no llamar más de una vez desde el mismo programa. Parece que fue diseñado para usarse una vez, y solo una vez al final de una secuencia de comandos. Otros casos de uso parecen romper pyplot
de alguna manera (¿máquina de estados?).
He tratado de utilizar combinaciones de p.draw()
y p.ion()
y p.ioff()
, pero no pudo conseguir el comportamiento que quería (ya sea las cosas no estaban bloqueando correctamente o las parcelas no aparecían en el momento adecuado).
También estoy confundido acerca de cómo el controlador de eventos puede ver s
aquí y si esta es una forma pobre de pasar la información de entrada/salida. Si no utilizo un contenedor mutable como una matriz o lista, la información que quiero establecer por el controlador de eventos simplemente se pierde como una variable local. ¿Hay algún otro método que me esté perdiendo, donde el hilo de la GUI puede pasar las señales al hilo principal? ¿Hay alguna manera de bloquear en main, sin un sondeo periódico o una espera ocupada, una señal del controlador de eventos antes de continuar?
así que supongo que en última instancia, mi pregunta principal es:
¿Hay un reemplazo aseado para p.show()
, que hace lo que yo quiero (el mismo comportamiento que p.show()
tiene la primera vez), o hace este tipo de código requiere una completar repensar/reescribir?
gracias por sus ideas. Pude cambiar el comportamiento de bloqueo de show() creando mpl desde source. – wim