pyqtgraph:在用户放置一个roi对象之前暂停ipython脚本的最简单方法

时间:2016-09-12 09:14:35

标签: python ipython jupyter-notebook pyqtgraph

我想在脚本中实现以下序列并尽可能简单(即,如果可能,请避免使用显式多线程):

  1. 处理一些数据。结果是一个2d numpy数组,比如a

  2. 使用a显示pw = pg.show(a)(在import pyqtgraph as qt之后并使用pyqt5)

  3. 定义圆形roi,例如通过

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

    1. 用户将roi移动到相关位置

    2. 读出roi坐标,继续使用脚本(使用roi坐标)

    3. 我的问题是:如何在3.和5之间的脚本中定义一个中断,这样用户就有时间做了4.以pyqtgraph没有被阻止的方式?理想情况下,用户可以通过按Enter或单击按钮来确认正确的roi位置。

      编辑:脚本在IPython中用qt gui执行。

      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)
      

1 个答案:

答案 0 :(得分:2)

1。 IPython控制台中的raw_input('')

如果脚本在IPython控制台中运行,您可以尝试添加

raw_input("Press Enter to continue...")
python3中的

input()来暂停脚本。用户必须返回并在ipython控制台中按Enter键,但代码很简单。

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

另一种解决方案可能是在ImageWindow中修补keyPressEvent。

请注意此解决方案同时使用全局猴子修补,请确保您知道这意味着什么。

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)