在Pyqt中嵌入Matplotlib画布的实例 - 阴谋没有显示

我试图尽量缩短范例。有一个similar question on SO。与上述问题提供的答案相反,我想定义一个MatplotlibFigure类,以便我可以重用代码。我在函数make_tab1中添加了对图的实例的引用self.figure = MatplotlibFigure(),并将self.figure添加到splitter。按钮似乎工作,因为我可以使用导航工具栏保存图形。但是,该轴没有显示在GUI中。在Pyqt中嵌入Matplotlib画布的实例 - 阴谋没有显示

为什么轴不可见?

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())

回答:

你忘了你的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)

回答:

您需要家长设置为FigureCanvas

self.canvas.setParent(self) 

以上是 在Pyqt中嵌入Matplotlib画布的实例 - 阴谋没有显示 的全部内容, 来源链接: utcz.com/qa/258025.html

回到顶部