我的绘图未显示在我的 pyqt5.QtWidgets
Posted
技术标签:
【中文标题】我的绘图未显示在我的 pyqt5.QtWidgets【英文标题】:My plot graph is not showing in my pyqt5.QtWidgets 【发布时间】:2020-12-15 17:39:42 【问题描述】:我目前正在学习如何将pyqt5
与matplotlib
一起使用,因此请实现此代码,当我在另一个窗口中按下按钮后会弹出此代码
我创建了另一个名为 canvas
的类,以便将来创建多个图形,例如条形图和直方图
当我运行此代码时,窗口会出现,pushButton 也会出现,但不会出现我创建的画布
如何在主窗口中显示画布(饼图)
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_())
【问题讨论】:
使用self.axes
而不是ax
。当您调用 Canvas 的 plot
方法时,您正在创建一个新的 Axes 对象,它会立即死亡。绘图后,您可能还需要在其中添加 self.draw()
。
【参考方案1】:
这个问题是因为你在不了解它的后果的情况下修改 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_())
【讨论】:
好的,我将自己编写 UI 以了解更多信息,但如果您不介意我还有一个问题,我尝试在从另一个页面导入它后通过在按钮上使用此功能来调用它但它不可调用,因为对话框包含不可调用的 Qdialogdef view_graph_output(self): self.window1=QtWidgets.QMainWindow() self.ui=Dialog() self.window1.show()
@RabeeQasem 我只回答 OP 在他的帖子中提出的问题,您遇到的其他问题我不会回答,因为您提供的信息很少,这是不可能的。请阅读How to Ask,如果您有新问题,请创建一个新帖子。
好的,谢谢,我会尝试自己解决:D以上是关于我的绘图未显示在我的 pyqt5.QtWidgets的主要内容,如果未能解决你的问题,请参考以下文章