我试图在其中创建一个带有嵌入式matplotlib小部件的GUI。我只需要用FigureCanvas完全填充图形,我已经尝试了大约100种不同的东西,没有任何东西改变了画布的大小。我在#34; #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_()
答案 0 :(得分:1)
继续学习之后,我想出来了。我在项目早期弄得一团糟,在更改初始设计时未能仔细重读我的代码。问题是我正在创建一个canvas小部件并将该小部件传递给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_()