2016-02-28 3 views
0

У меня есть сценарий, который некоторые участки Земельные участки изображения:Блокировка и продолжается в Matplotlib

from matplotlib import pyplot as plt 
from matplotlib import image as mpimg 

(...) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

(...) 

for img in images: 
    imgdata = mpimg.imread(img) 
    ax.imshow(imgdata) 
    plt.show(block=True) 

К сожалению, это, кажется, unpossible блокировать GUI и ждать ввода пользователя с fig.show(). Просто plt.show() блоков ... так что я должен использовать решение plt.show?

Кроме того, я слушаю пользовательские события, как это:

cid = fig.canvas.mpl_connect('key_press_event', on_key_press) 

def on_key_press(event): 
    if event.key == "n": 
     ax.cla() 
     plt.show(block=False) 

Мое намерение состоит в том, чтобы слушать «п» (например, «рядом»), а затем продолжить для цикла, следовательно, загрузить следующую информацию изображения и построение его снова и так далее в ожидании ввода пользователя ...

Однако второй вызов show() (plt.show(block=False)) обновляет изображение (так что данные ax очищается), но блокировка не снимается - для цикл не продолжается. Как я мог добиться такого поведения?

EDIT: мне нужны event.xdata, event.ydata, event.x, event.y значения matplotlib, поэтому реализация «рубить» с чем-то вроде input() и поэтому позволяя питона ждать ввода пользователя в консоли (и используя Matplotlib с block=False каждого время) не решит мою проблему.

+0

http://matplotlib.org/examples/pylab_examples/ginput_demo.html – tacaswell

+0

Спасибо за комментарий. На самом деле я использую 'ginput' для координат мыши, но мне тоже нужны ключевые слушатели. Я хочу создать ключевые ярлыки для основных операций, таких как увеличение/уменьшение яркости, сохранение изображения, загрузка следующего изображения, ... – daniel451

ответ

0

Я не совсем уверен, что поведение, которое вы хотите, но что-то вроде

def set_up_figure(): 
    fig, ax = plt.subplots() 
    fig.canvas.mpl_connect(..) 
    fig.canvas.mpl_connect(..) 
    return fig, ax 

for img in images: 
    fig, ax = set_up_figure() 
    ax.imshow(img) 
    plt.show(block=True) 

может работать.

Что plt.show делает (что fig.show не), это запустить цикл событий GUI, который является то, что, в конце концов, принимает пользовательский ввод, перемешивает его через его механизм обратного вызова, руки события к механизму MPL обратного вызова, который, в свою очередь, фактически выполняет ваши функции.

+0

Разве это не похоже на код, который у меня есть? В основном я хочу прослушиватель клавиш и после нажатия 'n' цикл for ('for img in images') должен продолжаться, но до сих пор я не смог реализовать это. 'plot.show (block = True)' блоки как навсегда - я не мог освободить его блок. – daniel451

+0

Это больше, чего вы хотите? https://gist.github.com/tacaswell/4545013 – tacaswell

+0

и в этом случае закройте окно, и оно будет продолжаться в цикле – tacaswell

Смежные вопросы