问题描述
我正在尝试在嵌入在 pyqt5 gui 中的彩色地图上绘制一个感兴趣的区域。这是我想要的一个例子。
import sys
from PyQt5.QtWidgets import (QWidget,QPushButton,QHBoxLayout,QVBoxLayout,QApplication)
from PyQt5 import QtCore
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import figureCanvasQTAgg as figureCanvas
import ROI_class as roi # ROI_class.py
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
self.drawButton.clicked.connect(self.draw_map_Callback)
self.roiButton.clicked.connect(self.choose_roi)
def initUI(self):
self.drawButton = QPushButton("draw map")
self.roiButton = QPushButton("roi")
self.hBox = QHBoxLayout()
self.hBox.addStretch(1)
self.hBox.addWidget(self.drawButton)
self.hBox.addWidget(self.roiButton)
self.vBox = QVBoxLayout()
self.vBox.addStretch(1)
self.vBox.addLayout(self.hBox)
self.setLayout(self.vBox)
self.setGeometry(500,500,500)
self.setwindowTitle('ROI')
self.show()
def draw_map_Callback(self):
img = np.ones((100,100)) * range(0,100)
fig,ax1 = plt.subplots()
self.con_canvas = figureCanvas(plt.figure(tight_layout=True))
self.con_canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
self.con_canvas.setFocus()
self.con_toolbar = NavigationToolbar(self.con_canvas,self)
self.vBox.addWidget(self.con_toolbar)
self.vBox.addWidget(self.con_canvas)
self._con_ax = self.con_canvas.figure.subplots()
self.con_img = self._con_ax.imshow(img,cmap ='jet')
self._con_ax.set_xlabel('xlabel')
self._con_ax.set_ylabel('ylabel')
self.con_cbar = self.con_canvas.figure.colorbar(self.con_img)
self._con_ax.set_aspect('equal')
def choose_roi(self):
y = roi.new_ROI(self.con_img)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
当我点击“绘制地图”时它会绘制一个颜色图。然后我希望它允许我用鼠标绘制感兴趣的区域并使用下面此链接上的代码获取蒙版。
https://github.com/martindurant/misc/blob/master/ROI.py
导入的“ROI_class”只是上面链接中代码的复制和粘贴。
我可以在 GUI 上成功绘制绘图,但是当我单击“roi”时,它不允许我绘制感兴趣的区域。
fig,ax1 = plt.subplots()
s = ax1.imshow(img,cmap ='jet')
ax1.set_xlabel('subcolor')
ax1.set_ylabel('ylabel')
y = new_ROI(s)
在代码的最后,它工作得很好,我能够绘制感兴趣的区域并获得它的掩码。
但是当我尝试在 GUI 中执行此操作时,它不会让我绘制感兴趣的区域。我很困惑为什么这不起作用。
解决方法
问题在于选择器(变量“y”)是一个局部变量,它会立即被销毁,导致无法执行所需的行为。解决办法是让它成为类的一个属性:
self.y = roi.new_ROI(self.con_img)