我嘗試有一個帶有一些按鈕和嵌入式空間的小 GUI,以便從 GUI 內的資料中繪制圖形。這是代碼:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QFileDialog, QMainWindow, QVBoxLayout
import sys
import os
import glob
import numpy as np
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class MplWidget(QtWidgets.QWidget):
def __init__(self,parent = None, width = 5, height = 4, dpi = 100):
self.fig = Figure(figsize=(width, height), dpi = dpi)
super().__init__(parent)
self.canvas = FigureCanvas(self.fig)
self.toolbar = NavigationToolbar(self.canvas, self)
layout = QtWidgets.QVBoxLayout(self)
layout.setGeometry(QtCore.QRect(340, 50, 451, 411))
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
self.ax = self.canvas.figure.add_subplot(111)
def plot_basic_line(self, X, Y, label):
self.ax.cla() # clears the axis
self.ax.plot(X, Y, label=label)
self.ax.grid(True)
self.ax.legend()
self.canvas.figure.tight_layout()
self.canvas.draw()
class Ui_MainWindow(QMainWindow):
#def __init__(self):
def setupUi(self, MainWindow):
super().__init__()
MainWindow.setObjectName("MainWindow")
MainWindow.resize(900, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.graphicsView = QtWidgets.QVBoxLayout(self.centralwidget)
self.mpl_canvas = MplWidget(self)
self.graphicsView.setGeometry(QtCore.QRect(340, 50, 451, 411))
self.graphicsView.addWidget(self.mpl_canvas)
self.B_Plot = QtWidgets.QPushButton(self.centralwidget)
self.B_Plot.setGeometry(QtCore.QRect(40, 280, 75, 23))
self.B_Plot.setObjectName("B_Plot")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.B_Plot.clicked.connect(self.plot)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.B_Plot.setText(_translate("MainWindow", "Plot"))
def plot(self):
x = np.linspace(0,10)
y = np.linspace(0,10)
self.mpl_canvas.plot_basic_line(x, y, label='plot1')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
現在,該圖占據了主視窗的整個空間,我不知道如何正確地將其保存在 GUI 中的機密空間中。下圖說明了這個問題(我在這里的示例中省略了大多數按鈕)。我想指定在 UI 上生成我的情節的區域,但現在我必須將所有內容放在情節周圍......
嵌入式繪圖占用整個視窗空間
uj5u.com熱心網友回復:
gridded_outer_frame您所需要的只是在網格 ( )中布置一些框架。在網格內放置另一個框架 ( inner_frame)。將inner_frame自動適合gridded_outer_frame.
然后在代碼中為 inner_frame 定義畫布處理程式、chart_layout 處理程式并將畫布放置在布局中:
chart = MplCanvas(self)
chart_layout = inner_frame # inner frame serves as a target for chart
chart_layout.addWidget(chart)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/477802.html
標籤:Python matplotlib qt5
