Я снова и снова сталкиваюсь с этой проблемой с 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()
в первый раз), или этот тип кода требует полного переосмысления / переписывания?