pyqtgraph:暂停 ipython 脚本直到用户放置 roi 对象的最简单方法
pyqtgraph: simplest way to pause ipython script until user has placed a roi object
我想在脚本中实现以下序列并使其尽可能简单(即尽可能避免显式多线程):
处理一些数据。结果是一个 2d numpy 数组,比如 a
使用 pw = pg.show(a)
显示 a
(在 import pyqtgraph as qt
之后并使用 pyqt5)
定义一个圆形的roi,例如通过
circ = pg.CircleROI([1024,1024],300)
pw.addItem(circ)
用户将roi移动到相关位置
读出roi坐标,继续脚本(使用roi坐标的地方)
我的问题是:如何在脚本中定义 3. 和 5. 之间的中断,以便用户有时间以 pyqtgraph 不被阻止的方式执行 4.?理想情况下,用户将通过按回车键或单击按钮来确认正确的 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。 raw_input('') 在 IPython 控制台中
如果脚本在 IPython 控制台中是 运行,您可以尝试添加
raw_input("Press Enter to continue...")
或 python3 中的 input()
暂停脚本。用户必须返回并在 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
另一个解决方案可能是猴子修补 ImageWindow 中的 keyPressEvent。
请注意,此解决方案同时使用 globals 和 monkey 补丁,请确保您知道这意味着什么。
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)
我想在脚本中实现以下序列并使其尽可能简单(即尽可能避免显式多线程):
处理一些数据。结果是一个 2d numpy 数组,比如
a
使用
pw = pg.show(a)
显示a
(在import pyqtgraph as qt
之后并使用 pyqt5)定义一个圆形的roi,例如通过
circ = pg.CircleROI([1024,1024],300)
pw.addItem(circ)
用户将roi移动到相关位置
读出roi坐标,继续脚本(使用roi坐标的地方)
我的问题是:如何在脚本中定义 3. 和 5. 之间的中断,以便用户有时间以 pyqtgraph 不被阻止的方式执行 4.?理想情况下,用户将通过按回车键或单击按钮来确认正确的 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。 raw_input('') 在 IPython 控制台中
如果脚本在 IPython 控制台中是 运行,您可以尝试添加
raw_input("Press Enter to continue...")
或 python3 中的 input()
暂停脚本。用户必须返回并在 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
另一个解决方案可能是猴子修补 ImageWindow 中的 keyPressEvent。
请注意,此解决方案同时使用 globals 和 monkey 补丁,请确保您知道这意味着什么。
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)