如何让 FigureCanvas 在嵌入在 pyqt GUI 中的 matplotlib 小部件中填充整个图形?

Luc*_*925 5 python matplotlib pyqt4

我试图制作一个带有嵌入式 matplotlib 小部件的 GUI。我只需要用 FigureCanvas 完全填充图形,我尝试了大约 100 种不同的东西,但没有一点改变画布的大小。我在用“#useless”表示的代码中留下了我的一些尝试,让您知道我尝试过它并且没有任何影响。请帮忙。

import sys
from PyQt4 import QtGui
from matplotlib import pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas

class Terminal(QtGui.QDialog):
def __init__(self, parent=None):
    try:        
        super(Terminal, self).__init__(parent)

        self.resize(1000,800)
        self.figure = plt.figure(facecolor='black')
        self.canvas = FigureCanvas(self.figure)
        self.canvas.autoFillBackground()#useless
        self.myComboBox = QtGui.QComboBox()
        self.plotButton = QtGui.QPushButton('Plot')      
        self.xMplWidget = MatplotlibWidget(self.canvas)         
        self.plotButton.clicked.connect(self.plotCircles)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.canvas)
        layout.addWidget(self.myComboBox)
        layout.addWidget(self.plotButton)
        policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)#useless
        self.canvas.setSizePolicy = policy#useless
        layout.setStretchFactor(self.canvas, 1)#useless
        self.setLayout(layout)
        self.canvas.autoFillBackground()#useless
    except Exception as err:
        print("Error in Terminal.init: Other - ", err)


def createDashboard(self,oDashboard):
    print("DoStuff")

def plotCircles(self):
    print("DoStuff")        




class MatplotlibWidget(FigureCanvas):
    def __init__(self, parent=None, title='Title', xlabel='x label', ylabel='y label', dpi=100, hold=False):
    super(MatplotlibWidget, self).__init__(Figure())       
    self.setParent(parent)
    self.figure = Figure(dpi=dpi)
    self.canvas = FigureCanvas(self.figure)

    self.theplot = self.figure.add_subplot(111)
    self.theplot.set_title(title)
    self.theplot.set_xlabel(xlabel)
    self.theplot.set_ylabel(ylabel)


def plotChart(self,oOxyName):
    print("DoStuff")     


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = Terminal()
    main.show()

    app.exec_()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Luc*_*925 6

继续学习后我明白了。我在项目的早期就搞砸了,并且在更改初始设计时未能仔细重新阅读我的代码。问题是我正在创建一个画布小部件并将该小部件传递给 MplWidget。MplWidget 正确地拥有自己的画布,因此不需要向其传递额外的画布。本质上,我是在画布小部件中制作 MplWidget,而不是在主窗体中制作 MplWidget。

这是更正后的代码以及更正说明。

import sys
from PyQt4 import QtGui
from PyQt4.QtCore import Qt
from matplotlib import pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import (
    FigureCanvasQTAgg as FigureCanvas)

class Terminal(QtGui.QDialog):
    def __init__(self, parent=None):
        try:        
            super(Terminal, self).__init__(parent)

            self.resize(1000,800)
            self.figure = plt.figure(facecolor='black')
#This was creating a canvas which I was adding my widget to (bad idea)
#            self.canvas = FigureCanvas(self.figure)

            self.myComboBox = QtGui.QComboBox()
            self.plotButton = QtGui.QPushButton('Plot')      
            self.xMplWidget = MatplotlibWidget()         
            self.plotButton.clicked.connect(self.plotCircles)

            layout = QtGui.QVBoxLayout()
            #Needed to add my MatplotlibWidget, not a canvas widget, because the MPLWidget has its own canvas
            #layout.addWidget(self.canvas)
            layout.addWidget(self.xMplWidget) #This was added

            layout.addWidget(self.myComboBox)
            layout.addWidget(self.plotButton)
            self.setLayout(layout)
        except Exception as err:
            print("Error in Terminal.init: Other - ", err)


    def createDashboard(self,oDashboard):
        print("DoStuff")

    def plotCircles(self):
        print("DoStuff")        


class MatplotlibWidget(FigureCanvas):
    def __init__(self, parent=None, title='Title', xlabel='x label', ylabel='y label', dpi=100, hold=False):
        super(MatplotlibWidget, self).__init__(Figure())       
        self.setParent(parent)
        self.figure = Figure(dpi=dpi)
        self.canvas = FigureCanvas(self.figure)

        self.theplot = self.figure.add_subplot(111)
        self.theplot.set_title(title)
        self.theplot.set_xlabel(xlabel)
        self.theplot.set_ylabel(ylabel)


    def plotChart(self,oOxyName):
        print("DoStuff")     


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = Terminal()
    main.show()

    app.exec_()
Run Code Online (Sandbox Code Playgroud)