Search code examples
pythonqtgraphpyqt6

plotting on PyQt6


I already wrote here before, but I deleted the question, because there were no specifics. Now I'll bring it in. I have an application that I have developed in PyQt6. It contains three buttons for switching: if you click on the " 2 page" button, there will be 2 pages with the inscription 2 page and similarly with the "3 page" button. The question is: page 1 should display a plot, in the pizdec area, however I get the following error: AttributeError: 'QWidget' object has no attribute 'plot'.

I'm not really good at OOP yet, so I don't quite understand how to fix it. For plotting i use pyqtgraph library. Code generated by Qt Designer.

from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(1495, 788)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setStyleSheet("\n"
"background-color: rgb(222, 222, 222);")
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QtWidgets.QFrame(parent=self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 131, 761))
        self.frame.setStyleSheet("background-color: rgb(21, 21, 21);")
        self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame.setObjectName("frame")
        self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.frame)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 80, 111, 261))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
        self.pushButton.setSizePolicy(sizePolicy)
        self.pushButton.setStyleSheet("border: 0px solid;\n"
"color: rgb(255, 255, 255);\n"
"")
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_3 = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth())
        self.pushButton_3.setSizePolicy(sizePolicy)
        self.pushButton_3.setStyleSheet("border: 0px solid;\n"
"color: rgb(255, 255, 255);")
        self.pushButton_3.setObjectName("pushButton_3")
        self.verticalLayout.addWidget(self.pushButton_3)
        self.pushButton_2 = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())
        self.pushButton_2.setSizePolicy(sizePolicy)
        self.pushButton_2.setStyleSheet("border: 0px solid;\n"
"color: rgb(255, 255, 255);")
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.frame_2 = QtWidgets.QFrame(parent=self.centralwidget)
        self.frame_2.setGeometry(QtCore.QRect(130, 0, 1371, 31))
        self.frame_2.setStyleSheet("background-color: rgb(25, 25, 25);")
        self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame_2.setObjectName("frame_2")
        self.frame_3 = QtWidgets.QFrame(parent=self.centralwidget)
        self.frame_3.setGeometry(QtCore.QRect(130, 30, 1371, 731))
        self.frame_3.setStyleSheet("background-color: rgb(71, 71, 71);\n"
"background-color: rgb(34, 34, 34);")
        self.frame_3.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame_3.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame_3.setObjectName("frame_3")
        self.graph = QtWidgets.QStackedWidget(parent=self.frame_3)
        self.graph.setGeometry(QtCore.QRect(0, 10, 1361, 721))
        self.graph.setObjectName("graph")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.pizdec = QtWidgets.QWidget(parent=self.page)
        self.pizdec.setGeometry(QtCore.QRect(70, 20, 1231, 441))
        self.pizdec.setObjectName("pizdec")
        self.graph.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.label_2 = QtWidgets.QLabel(parent=self.page_2)
        self.label_2.setGeometry(QtCore.QRect(210, 100, 831, 401))
        font = QtGui.QFont()
        font.setPointSize(80)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.graph.addWidget(self.page_2)
        self.page_3 = QtWidgets.QWidget()
        self.page_3.setObjectName("page_3")
        self.label_3 = QtWidgets.QLabel(parent=self.page_3)
        self.label_3.setGeometry(QtCore.QRect(300, 100, 831, 401))
        font = QtGui.QFont()
        font.setPointSize(80)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.graph.addWidget(self.page_3)
        self.frame_3.raise_()
        self.frame.raise_()
        self.frame_2.raise_()
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1495, 26))
        self.menubar.setObjectName("menubar")
        self.menuw3rrewd = QtWidgets.QMenu(parent=self.menubar)
        self.menuw3rrewd.setObjectName("menuw3rrewd")
        MainWindow.setMenuBar(self.menubar)
        self.menubar.addAction(self.menuw3rrewd.menuAction())

        self.retranslateUi(MainWindow)
        self.graph.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "1 page"))
        self.pushButton_3.setText(_translate("MainWindow", "2 page"))
        self.pushButton_2.setText(_translate("MainWindow", "3 page"))
        self.label_2.setText(_translate("MainWindow", "2 page"))
        self.label_3.setText(_translate("MainWindow", "3 page"))
        self.menuw3rrewd.setTitle(_translate("MainWindow", "w3rrewd"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())

Here's the logic code I wrote.

import sys
from PyQt6 import QtWidgets, QtGui, QtCore
from untdwdfd import Ui_MainWindow
from pyqtgraph import PlotWidget
import pyqtgraph as pg

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
       
        QtCore.QMetaObject.connectSlotsByName(self)

        self.pizdec.plot([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        
    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        self.graph.setCurrentIndex(0)

    @QtCore.pyqtSlot()
    def on_pushButton_3_clicked(self):
        self.graph.setCurrentIndex(1)

    @QtCore.pyqtSlot()
    def on_pushButton_2_clicked(self):
        self.graph.setCurrentIndex(2)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

image 1

image 2 image 3


Solution

  • If you look at your UI file you might notice that self.pizdec is defined as a QWidget.

    #line 80ish
    self.pizdec = QtWidgets.QWidget(parent=self.page)
    self.pizdec.setGeometry(QtCore.QRect(70, 20, 1231, 441))
    self.pizdec.setObjectName("pizdec")
    

    And then in your logic file you are calling:

    self.pizdec.plot([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    

    You are receiving the error because QWidget doesn't have a plot method.

    You technically shouldn't edit the uic files, so what you can do is edit your ui in designer and leave an empty space where self.pizdec is and then add the widget in your logic file.

    For example:

    import sys
    from PyQt6 import QtWidgets, QtGui, QtCore
    from untdwdfd import Ui_MainWindow
    from pyqtgraph import PlotWidget
    import pyqtgraph as pg
    
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
           
            QtCore.QMetaObject.connectSlotsByName(self)
            self.pizdec = QPlotWidget(parent=self.page)
            self.pizdec.setGeometry(QtCore.QRect(70, 20, 1231, 441))
            self.pizdec.setObjectName("pizdec")
            self.pizdec.plot([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
            
        @QtCore.pyqtSlot()
        def on_pushButton_clicked(self):
            self.graph.setCurrentIndex(0)
    
        @QtCore.pyqtSlot()
        def on_pushButton_3_clicked(self):
            self.graph.setCurrentIndex(1)
    
        @QtCore.pyqtSlot()
        def on_pushButton_2_clicked(self):
            self.graph.setCurrentIndex(2)
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec())
    

    enter image description here