Qt Framework, PyQt5 and AttributeError: 'MyApp' object has no attribute 'myAttribute'
Question: Last week I started to learn Python and I developed some command line apps.
Now I would like to develop apps with GUI. I searched in internet and I found
a project that fits my needs: Qt Project (<http://qt-project.org>) and PyQt
(<http://www.riverbankcomputing.com/software/pyqt/intro>). I installed Qt
5.3.2 Open Source, SIP 4.16.4, PyQt5 5.3.2 on Mac OS X 10.10 and python 2.7.6.
After some troubles on installing Qt and PyQt, finally I managed to make them
work. If I open example projects from PyQt example folder the gui appears
without any problems. So I created my GUI with Qt Creator and then I used
pyuic5 to generate python code. This is what pyuic5 created (file name
"**myapp_auto.py** "):

    
    
    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file '/Users/andrea/Developer/Qt/mainwindow.ui'
    #
    # Created: Mon Nov 17 14:20:14 2014
    #      by: PyQt5 UI code generator 5.3.2
    #
    # WARNING! All changes made in this file will be lost!
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(400, 300)
            self.centralWidget = QtWidgets.QWidget(MainWindow)
            self.centralWidget.setObjectName("centralWidget")
            self.ok = QtWidgets.QPushButton(self.centralWidget)
            self.ok.setGeometry(QtCore.QRect(140, 120, 115, 32))
            self.ok.setAccessibleName("")
            self.ok.setObjectName("ok")
            self.text = QtWidgets.QLabel(self.centralWidget)
            self.text.setGeometry(QtCore.QRect(100, 70, 181, 16))
            self.text.setAccessibleName("")
            self.text.setAlignment(QtCore.Qt.AlignCenter)
            self.text.setObjectName("text")
            self.time = QtWidgets.QDateTimeEdit(self.centralWidget)
            self.time.setGeometry(QtCore.QRect(100, 180, 194, 24))
            self.time.setAccessibleName("")
            self.time.setObjectName("time")
            MainWindow.setCentralWidget(self.centralWidget)
            self.menuBar = QtWidgets.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 22))
            self.menuBar.setObjectName("menuBar")
            self.menuMyApp = QtWidgets.QMenu(self.menuBar)
            self.menuMyApp.setObjectName("menuMyApp")
            self.menuEdit = QtWidgets.QMenu(self.menuBar)
            self.menuEdit.setObjectName("menuEdit")
            MainWindow.setMenuBar(self.menuBar)
            self.mainToolBar = QtWidgets.QToolBar(MainWindow)
            self.mainToolBar.setObjectName("mainToolBar")
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
            self.statusBar = QtWidgets.QStatusBar(MainWindow)
            self.statusBar.setObjectName("statusBar")
            MainWindow.setStatusBar(self.statusBar)
            self.menuBar.addAction(self.menuMyApp.menuAction())
            self.menuBar.addAction(self.menuEdit.menuAction())
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.ok.setText(_translate("MainWindow", "Ok"))
            self.text.setText(_translate("MainWindow", "I\'m a GUI"))
            self.menuMyApp.setTitle(_translate("MainWindow", "MyApp"))
            self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
    

After that I added a new python file where I put my code; this is what i wrote
(file name "**myapp.py** "):

    
    
    #!/usr/bin/env python
    
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from myapp_auto import Ui_MainWindow
    import sys
    import time
    
    
    class MyApp(Ui_MainWindow):
    
        parse_triggered = pyqtSignal()
    
        def __init__(self, parent=None, name=None):
            Ui_MainWindow.__init__(self)
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        MainWindow = QMainWindow()
        ui = MyApp()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

Then, I run myapp.py and I verified that all GUI elements appeared to be where
they should be. Well...now arrive my issue: I tried to access with code the
"time" element in MainWindow modifying init def thus:

    
    
    def __init__(self, parent=None, name=None):
                Ui_MainWindow.__init__(self)
    
                # Set the date to now
                now = QDateTime()
                now.setTime_t(int(time.time()))
                self.time.setDateTime(now)
    

But the compiler shows alway this error:

> AttributeError: 'MyApp' object has no attribute 'time'

This happen even if I try to access any other element ("ok", "text"). Will
surely be a stupid mistake but I just can not figure out where I went wrong.
Thank you all guys! Have a good day,

Andrea


Answer: You're not far off.

The `MyApp` class needs to inherit `QMainWindow`, and you don't need to use
the `time` module. Try something like this:

    
    
    class MyApp(QMainWindow, Ui_MainWindow):
        parse_triggered = pyqtSignal()
    
        def __init__(self, parent=None, name=None):
            super(MyApp, self).__init__(parent)
            self.setupUi(self)
            # Set the date to now
            self.time.setDateTime(QDateTime.currentDateTime())
    
    if __name__ == "__main__":
    
        app = QApplication(sys.argv)
        window = MyApp()
        window.show()
        sys.exit(app.exec_())
    

