Python 我的打印图未显示在pyqt5.QtWidgets中

Python 我的打印图未显示在pyqt5.QtWidgets中,python,matplotlib,pyqt5,Python,Matplotlib,Pyqt5,我目前正在学习如何将pyqt5与matplotlib一起使用,因此实现此代码,在我按下另一个窗口中的按钮后将弹出此代码 我创建了另一个名为canvas的类,以便将来创建多个图形,如条形图和直方图 当我运行此代码时,窗口将出现,按钮也将出现,但不是我创建的画布 如何在主窗口中显示画布(饼图) from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure

我目前正在学习如何将
pyqt5
matplotlib
一起使用,因此实现此代码,在我按下另一个窗口中的按钮后将弹出此代码

我创建了另一个名为
canvas
的类,以便将来创建多个图形,如条形图和直方图

当我运行此代码时,窗口将出现,按钮也将出现,但不是我创建的画布

如何在主窗口中显示画布(饼图)

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class window(QtWidgets.QMainWindow):
    def setupUi(self,Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(900, 500)

        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(0, 380, 141, 61))
        self.pushButton.setObjectName("pushButton")
        

        self.canvas = Canvas(self, width=8, height=4)
        self.canvas.move(0,0)

 
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        
        

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "output window"))


class Canvas(FigureCanvas):
    def __init__(self, parent = None, width = 5, height = 5, dpi = 100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
      
        self.plot()

    def plot(self):

        x = np.array([50, 30,40])
        labels = ["Apples", "Bananas", "Melons"]
        ax = self.figure.add_subplot(111)
        ax.pie(x, labels=labels)
        

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = window()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())


造成此问题的原因是,您正在修改Qt Designer生成的代码,而不了解其后果。QtDesigner生成的类不是窗口,而是一个只填充窗口的类。例如,在窗口修改的情况下,QMainWindow具有画布,但您已经创建了另一个名为Dialog的小部件,该小部件就是您显示的小部件(如果您选中QPushButton,则它是Dialog的子部件,因此也会显示)。另一方面,您只需创建一个轴

因此,您不应该修改QtDesigner生成的类,而应该创建从小部件继承的另一个类,并使用前一个类填充它

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_Dialog:
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(900, 500)

        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(0, 380, 141, 61))
        self.pushButton.setObjectName("pushButton")

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "output window"))


class Canvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=5, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
        self.plot()

    def plot(self):
        x = np.array([50, 30, 40])
        labels = ["Apples", "Bananas", "Melons"]
        self.axes.pie(x, labels=labels)
        self.draw()


class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.canvas = Canvas(self, width=8, height=4)
        self.canvas.move(0, 0)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

造成此问题的原因是,您正在修改Qt Designer生成的代码,而不了解其后果。QtDesigner生成的类不是窗口,而是一个只填充窗口的类。例如,在窗口修改的情况下,QMainWindow具有画布,但您已经创建了另一个名为Dialog的小部件,该小部件就是您显示的小部件(如果您选中QPushButton,则它是Dialog的子部件,因此也会显示)。另一方面,您只需创建一个轴

因此,您不应该修改QtDesigner生成的类,而应该创建从小部件继承的另一个类,并使用前一个类填充它

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_Dialog:
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(900, 500)

        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(0, 380, 141, 61))
        self.pushButton.setObjectName("pushButton")

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "output window"))


class Canvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=5, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
        self.plot()

    def plot(self):
        x = np.array([50, 30, 40])
        labels = ["Apples", "Bananas", "Melons"]
        self.axes.pie(x, labels=labels)
        self.draw()


class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.canvas = Canvas(self, width=8, height=4)
        self.canvas.move(0, 0)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

使用
self.axes
而不是
ax
。调用画布的
plot
方法时,您正在创建一个新的Axis对象,该对象立即消失。打印后,您可能还必须在其中抛出一个
self.draw()
。使用
self.axes
而不是
ax
。调用画布的
plot
方法时,您正在创建一个新的Axis对象,该对象立即消失。您可能还必须抛出一个
self.draw()
绘图后在那里。好的,我将自己编写UI代码以了解更多信息,但如果您不介意的话,我还有一个问题,在从另一个页面导入UI后,在按钮上使用此函数尝试调用它,但它不可调用,因为对话框包含Qdialog,无法调用
def view\u graph\u output(self):self.window1=QtWidgets.QMainWindow()self.ui=Dialog()self.window1.show()
@RabeeQasem我只回答OP在帖子中提出的问题,其他问题我不会回答,因为你提供的信息很少,这是不可能的。请阅读,如果您有新问题,请创建一个新帖子。好的,谢谢,我将尝试自己解决它:Dokay我将自己编写UI代码以了解更多信息,但如果您不介意的话,我还有一个问题,在从另一页导入UI后,在按钮上使用此函数尝试调用它,但它不可调用,因为包含Qdialog的对话框不可调用
def view\u graph\u output(self):self.window1=QtWidgets.QMainWindow()self.ui=Dialog()self.window1.show()
@RabeeQasem我只回答OP在帖子中提出的问题,其他问题我不会回答,因为你提供的信息很少,这是不可能的。请阅读,如果你有一个新的问题,然后创建一个新的帖子。好的,谢谢,我会努力解决我自己:D