簡體   English   中英

為什么我不能在嵌入在 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_())

單擊“繪制地圖”時,它會繪制顏色圖。 然后我希望它允許我用鼠標繪制一個感興趣的區域,並使用下面這個鏈接上的代碼獲得一個蒙版。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM