簡體   English   中英

在pyqt中嵌入Matplotlib畫布的實例-圖未顯示

[英]Embedd instance of Matplotlib canvas in pyqt - plot not showing up

我試圖使示例盡可能簡短。 關於SO也有類似的問題 與上述問題提供的答案相反,我想定義一個MatplotlibFigure類,以便可以重用代碼。 我添加到圖的實例的引用作為self.figure = MatplotlibFigure()在功能make_tab1並加入self.figuresplitter 該按鈕似乎起作用,因為我可以使用導航工具欄保存該圖。 但是,該軸未在GUI中顯示。

為什么軸不可見?

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget, QVBoxLayout,\
                            QHBoxLayout, QGridLayout, QSplitter, QFrame, QTextEdit, QFileDialog, QGroupBox,\
                            QButtonGroup, QLabel, QRadioButton

from PyQt5 import QtCore

import matplotlib
from matplotlib import figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

class MatplotlibFigure(QWidget):

    # constructor
    def __init__(self):
        super().__init__()
        #self.layout = QBoxLayout()
        self.figure = matplotlib.figure.Figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        #self.layout.addWidget(self.canvas)

    def plot(self):
        self.figure.clf()
        ax = self.figure.add_subplot(111)
        x = [i for i in range(100)]
        y = [i**0.5 for i in x]
        ax.plot(x, y, 'g*-')
        self.canvas.draw_idle()
        print('PLOTTED')


class MainApp(QMainWindow):
    """ This creates the main Window and configures its look
    """
    def __init__(self):
        '''
        Initializes the class with standard parameters
        '''
        super().__init__()
        self.title = 'Data Analysis App'

        # start at top left corner of the screen
        self.left = 0
        self.top = 0

        # set the window height and width
        self.width = 1280
        self.height = 780

        # set the styles of fonts etc.
        self.setStyleSheet('font-size: 16pt')

        # call the makeUI method
        self.makeUI()

    def makeUI(self):
        # set window geometry
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # generate the tab layout
        self.table_widget = MyTableWidget()
        self.setCentralWidget(self.table_widget)

        # apparently we have to call the show method in order to show it
        self.show()


class MyTableWidget(QWidget):
    """
    Initializes the tab layout
    """

    def __init__(self):
        super().__init__()
        self.layout = QVBoxLayout(self)

        # initialize the tab screens
        self.tabs = QTabWidget()

        # add the tab screens to the tab widget
        self.tabs.resize(600, 600)

        # make the layout of the tabs
        self.make_tab1()

        # initialize the tabs
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)

    def make_tab1(self):
        """Style of tab 1 is created here"""

        '''Defines master layout of tab1'''
        tab1 = QWidget()
        tab1.layout = QHBoxLayout()

        '''Button Section'''

        # converts the data into excel and pandas dataframe
        btn_plot_data = QPushButton('Plot data')
        btn_plot_data.clicked.connect(self.plot_data)


        '''Button layout section'''
        btn_layout = QVBoxLayout()
        btn_layout.addWidget(btn_plot_data)
        btn_layout.addStretch(1)

        '''Page layout section '''

        left = QFrame()
        left.setLayout(btn_layout)

        self.figure = MatplotlibFigure()

        # combine the buttons and the canvas in a splitter layout
        splitter1 = QSplitter(QtCore.Qt.Horizontal)
        splitter1.addWidget(left)
        splitter1.addWidget(self.figure)
        splitter1.setSizes([5, 400])


        # add the last splitter to the layout
        tab1.layout.addWidget(splitter1)
        tab1.setLayout(tab1.layout)
        self.tabs.addTab(tab1, 'Get Data Module')

    ''' Methods section
    '''
    def plot_data(self):
        self.figure.plot()


if __name__ == '__main__':
    """ This code block is always the same and makes sure that e.g. STRG+C kills the window etc.
    """
    app = QApplication(sys.argv)
    ex = MainApp()
    sys.exit(app.exec())

您需要將父FigureCanvas設置為FigureCanvas

self.canvas.setParent(self)

在此處輸入圖片說明

您忘記為MatplotlibFigure類設置布局(請記住,在您的情況下,它是QWidget,而不是畫布)

def __init__(self):
    super().__init__()
    #self.layout = QBoxLayout()
    self.figure = matplotlib.figure.Figure()
    self.canvas = FigureCanvas(self.figure)
    self.toolbar = NavigationToolbar(self.canvas, self)

    layout = QVBoxLayout(self)
    layout.addWidget(self.toolbar)
    layout.addWidget(self.canvas)

暫無
暫無

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

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