Zanam
Zanam

Reputation: 4807

Error implementing basic example for PyQt

I am working through a basic PyQt designer example to create a script to accept two numbers and add them.

I created the calc_ui.py file as:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_CalculatorUI(object):
    def setupUi(self, CalculatorUI):
        CalculatorUI.setObjectName(_fromUtf8("CalculatorUI"))
        CalculatorUI.resize(219, 134)
        self.gridLayout = QtGui.QGridLayout(CalculatorUI)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.labelX = QtGui.QLabel(CalculatorUI)
        self.labelX.setObjectName(_fromUtf8("labelX"))
        self.gridLayout.addWidget(self.labelX, 0, 0, 1, 1)
        self.lineEditX = QtGui.QLineEdit(CalculatorUI)
        self.lineEditX.setObjectName(_fromUtf8("lineEditX"))
        self.gridLayout.addWidget(self.lineEditX, 0, 1, 1, 1)
        self.labelY = QtGui.QLabel(CalculatorUI)
        self.labelY.setObjectName(_fromUtf8("labelY"))
        self.gridLayout.addWidget(self.labelY, 1, 0, 1, 1)
        self.lineEditY = QtGui.QLineEdit(CalculatorUI)
        self.lineEditY.setObjectName(_fromUtf8("lineEditY"))
        self.gridLayout.addWidget(self.lineEditY, 1, 1, 1, 1)
        self.labelZ = QtGui.QLabel(CalculatorUI)
        self.labelZ.setObjectName(_fromUtf8("labelZ"))
        self.gridLayout.addWidget(self.labelZ, 2, 0, 1, 1)
        self.lineEditZ = QtGui.QLineEdit(CalculatorUI)
        self.lineEditZ.setReadOnly(True)
        self.lineEditZ.setObjectName(_fromUtf8("lineEditZ"))
        self.gridLayout.addWidget(self.lineEditZ, 2, 1, 1, 1)
        self.buttonCalc = QtGui.QPushButton(CalculatorUI)
        self.buttonCalc.setObjectName(_fromUtf8("buttonCalc"))
        self.gridLayout.addWidget(self.buttonCalc, 3, 0, 1, 2)

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

    def retranslateUi(self, CalculatorUI):
        CalculatorUI.setWindowTitle(_translate("CalculatorUI", "Calculator", None))
        self.labelX.setText(_translate("CalculatorUI", "X:", None))
        self.labelY.setText(_translate("CalculatorUI", "Y:", None))
        self.labelZ.setText(_translate("CalculatorUI", "Z:", None))
        self.buttonCalc.setText(_translate("CalculatorUI", "Calculate", None))

My main.py is:

from PyQt4 import QtGui, QtCore
import sys
from calc_ui import Ui_CalculatorUI

class Calculator(Ui_CalculatorUI):
    def __init__(self):
        Ui_CalculatorUI.__init__(self)
        #self.setupUi(self)
        self.buttonCalc.clicked.connect(self.handleCalculate)

    def handleCalculate(self):
        x = int(self.lineEditX.text())
        y = int(self.lineEditY.text())
        self.lineEditZ.setText(str(x + y))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Calculator()
    window.show()
    sys.exit(app.exec_())

However, my error is:

AttributeError: 'Calculator' object has no attribute 'buttonCalc'

even though I can see that 'buttonCalc' has been defined in the calc_ui.py file.

I have tried different syntax but running into a wall here.

Upvotes: 1

Views: 49

Answers (1)

eyllanesc
eyllanesc

Reputation: 244132

Qt Designer generate a class to fill a widget, ie is not a widget, you must create a class that inherits from the widget that I take as a template, assume that it is Dialog, then you should call the setupUi() function that fills the widget

class Calculator(QtGui.QDialog, Ui_CalculatorUI):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)
        self.buttonCalc.clicked.connect(self.handleCalculate)

    def handleCalculate(self):
        x = int(self.lineEditX.text())
        y = int(self.lineEditY.text())
        self.lineEditZ.setText(str(x + y))

Output:

enter image description here

Upvotes: 1

Related Questions