为什么我不能在 pyqt5 gui 中嵌入的 matplotlib 颜色图中成功绘制感兴趣区域?

Why can't I successfully draw the region of interest in a matplotlib color map embedded in a pyqt5 gui?

我正在尝试在 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, 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_())

当我点击“绘制地图”时,它会绘制一个颜色图。然后我希望它允许我用鼠标绘制一个感兴趣的区域,并使用下面这个 link 上的代码获得一个掩码。

https://github.com/martindurant/misc/blob/master/ROI.py

导入的“ROI_class”只是上面link中代码的复制粘贴。

我可以在 GUI 上成功绘制绘图,但是当我单击“roi”时,它不允许我绘制感兴趣的区域。

当我创建一个新文件并将代码粘贴到上面的 link 中时,类似

fig, ax1 = plt.subplots()
s = ax1.imshow(img, cmap ='jet')
ax1.set_xlabel('subcolor')
ax1.set_ylabel('ylabel')
y = new_ROI(s)

在代码的最后,它工作得很好,我能够绘制感兴趣的区域并得到它的掩码。

但是当我尝试在 GUI 中执行此操作时,它不会让我绘制感兴趣的区域。我很困惑为什么这不起作用。

问题在于选择器(变量“y”)是一个局部变量,它会立即被破坏,导致无法执行所需的行为。解决方案是使它成为 class:

的属性
self.y = roi.new_ROI(self.con_img)