Pyqtgraph:暂停python脚本直到用户放置ROI对象的最简单方法



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

  1. 处理一些数据。结果是一个二维numpy数组,例如a

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

  3. 定义一个循环roi,例如通过

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

  • 用户将roi移动到相关位置

  • 读出roi坐标,继续执行脚本(使用roi坐标的地方)

  • 我的问题是:我如何在脚本3之间定义一个中断。和5。这样用户就有时间做4。,在某种程度上pyqtgraph不被阻塞?理想情况下,用户将通过按回车键或点击按钮来确认正确的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)
    

    raw_input(")在IPython控制台

    如果脚本在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进行monkey patch。

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

    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)