pyqtgraph: самый простой способ приостановить скрипт ipython, пока пользователь не поместит объект roi

Я хотел бы реализовать следующую последовательность в сценарии и сделать ее как можно более простой (т. е., если возможно, избежать явной многопоточности):

  1. Обработать некоторые данные. Результатом является массив 2d numpy, скажем, a

  2. Показать a с помощью pw = pg.show(a) (после import pyqtgraph as qt и с использованием pyqt5)

  3. Определите круговую область интереса, например. с помощью

circ = pg.CircleROI([1024,1024],300) pw.addItem(circ)

  1. Пользователь перемещает область интереса в соответствующее место

  2. Считайте координаты области интереса, продолжите работу со сценарием (где используются координаты области интереса)

Мой вопрос: как я могу определить перерыв в сценарии между 3. и 5. таким образом, чтобы у пользователя было время сделать 4. таким образом, чтобы pyqtgraph не блокировался? В идеале пользователь должен подтвердить правильное положение области интереса, нажав клавишу ввода или кнопку.

Изменить: скрипт выполняется в IPython с графическим интерфейсом qt.

Edit2: вот полный тестовый скрипт, который нужно выполнить в IPython. Я хочу, чтобы пользователь мог перемещать круг до того, как roi будет оценен, т. Е. Чтобы вывод на печать отличался от (slice(1024, 1174, None), slice(1024, 1174, None))

import numpy as np
import pyqtgraph as pg

a = np.array(range(2048**2)).reshape((2048,2048))
pw = pg.show(a)
circ = pg.CircleROI([1024,1024],300)
pw.addItem(circ)



roi = np.s_[int(circ.pos().x()):int(circ.pos().x()+circ.size().x()/2),\
            int(circ.pos().y()):int(circ.pos().y()+circ.size().x()/2)]

print(roi)

person Felix    schedule 12.09.2016    source источник


Ответы (1)


1. raw_input('') в консоли IPython

Если скрипт работает в консоли IPython, вы можете попробовать добавить

raw_input("Press Enter to continue...")

или input() в python3, чтобы приостановить скрипт. Пользователь должен вернуться и нажать Enter в консоли ipython, но код прост.

import numpy as np
import pyqtgraph as pg

a = np.array(range(2048**2)).reshape((2048,2048))
pw = pg.show(a)
circ = pg.CircleROI([1024,1024],300)
pw.addItem(circ)

raw_input("Press Enter to continue...")

roi = np.s_[int(circ.pos().x()):int(circ.pos().x()+circ.size().x()/2),\
            int(circ.pos().y()):int(circ.pos().y()+circ.size().x()/2)]

print(roi)

2. Исправление обезьяны keyPressEvent

Другим решением может быть исправление keyPressEvent в ImageWindow.

Учтите, что в этом решении используются как глобальные переменные, так и исправления обезьян. Убедитесь, что вы понимаете, что это значит.

import numpy as np
from PyQt4 import QtCore, QtGui
import pyqtgraph as pg


a = np.array(range(2048**2)).reshape((2048,2048))
pw = pg.show(a)
circ = pg.CircleROI([1024,1024],300)
pw.addItem(circ)

def myKeyPressEvent(e):
    if e.key() == QtCore.Qt.Key_Enter or e.key() == QtCore.Qt.Key_Return:
        global selectionFinished
        selectionFinished = True

# Monkey patch
selectionFinished = False
pw.keyPressEvent = myKeyPressEvent

while not selectionFinished:
    QtGui.QApplication.processEvents()

roi = np.s_[int(circ.pos().x()):int(circ.pos().x()+circ.size().x()/2),\
            int(circ.pos().y()):int(circ.pos().y()+circ.size().x()/2)]

print(roi)
person luddek    schedule 20.09.2016
comment
Это тоже была моя первая мысль. Однако команда raw_input также замораживает графический интерфейс. Он даже не откроет фигуру, пока я не нажму Enter. Если я открою фигуру вручную (т.е. выполню все строки до raw_input), то в момент выполнения строки raw_input я больше не смогу перемещать круг на фигуре. - person Felix; 20.09.2016
comment
Он отлично работал через мою консоль ipython. Я поместил скрипт в test.py, а затем запустил import test в ipython. - person luddek; 20.09.2016
comment
Правда, он работает в автономном ipython, но не в моей IDE spyder, где я изначально тестировал его. Однако в автономной версии я не могу закрыть фигуру после запуска этого кода. В любом случае, второе решение работает отлично, это именно то, что мне нужно! - person Felix; 20.09.2016