Я снова и снова сталкивался с этой проблемой с show()
, и я уверен, что делаю что-то не так, но не уверен в том, что "правильный" способ сделать то, что я хочу.
И [я думаю], что я хочу, чтобы какой-то способ заблокировать в основном потоке, пока событие не произойдет в потоке графического интерфейса, что-то вроде этого работает в первый раз:
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
здесь, и является ли это плохим способом передачи информации в/из. Если я не использую изменяемый контейнер, такой как массив или список, информация, которую я хочу установить обработчиком событий, просто теряется как локальная переменная. есть ли какой-то другой метод, который я упускаю, когда поток графического интерфейса может передавать сигналы обратно в основной поток? есть ли способ заблокировать в основном, без периодического опроса или ожидания, для сигнала от обработчика событий, прежде чем продолжить?
Итак, я думаю, что в конечном итоге мой главный вопрос:
Есть ли аккуратная замена для p.show()
, которая делает то, что я хочу (то же поведение, что и p.show()
в первый раз), или такой код требует полного переосмысления/перезаписи?