DEV Community

Phúc Dương Minh
Phúc Dương Minh

Posted on

Help me fix the error in my python code

I don't know what mistake I made in the loop to create the keyboard and set it up in the gridlayout. The loop is located on lines 66 to 69 and 25 to 28.

Here is my code:

from PySide6.QtWidgets import *
from PySide6.QtCore import *
import sys

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(250, 300)
        layout = QVBoxLayout(self)

        self.memoryNumber = list()
        self.recentNum = list()

        self.rememNumLabel = QLabel("")
        self.recentNumLabel = QLabel(''.join(map(str,self.recentNum)))

        self.math = None
        self.mathClikedTime = 0
        numberOfKeyNumber = 10
        keyBoardRow = 5
        keyBoardColumn = 4

        self.keyNumber = []

        for i in range(numberOfKeyNumber):
            key = QPushButton(str(i))
            self.keyNumber.append(key)
            key.clicked.connect(lambda checked, n=i: self.keyNumberClicked(n))

        self.keyPercent = QPushButton("%")
        self.keyClear = QPushButton("C")
        self.keyClearEntry = QPushButton("CE")
        self.keyDivide = QPushButton("÷")
        self.keyPlus = QPushButton("+")
        self.keyMinus = QPushButton("-")
        self.keyTimes = QPushButton("x")
        self.keyNegativePositive = QPushButton("+/-")
        self.keyDecimal = QPushButton(".")
        self.keyEqual = QPushButton("=")
        self.keyDel = QPushButton("")

        self.keyClear.clicked.connect(self.keyClearClicked)
        self.keyClearEntry.clicked.connect(self.keyClearEntryClicked)
        self.keyDivide.clicked.connect(self.keyDivideCliked)
        self.keyPlus.clicked.connect(self.keyPlusCliked)
        self.keyMinus.clicked.connect(self.keyMinusCliked)
        self.keyTimes.clicked.connect(self.keyTimesCliked)
        self.keyNegativePositive.clicked.connect(self.keyNegativePositiveClicked)
        self.keyDecimal.clicked.connect(self.keyDecimalClicked)
        self.keyEqual.clicked.connect(self.keyEqualClicked)
        self.keyDel.clicked.connect(self.keyDelClicked)

        numbersKeyBoard = QGridLayout()

        numbersKeyBoard.addWidget(self.keyNegativePositive, 4, 0)
        numbersKeyBoard.addWidget(self.keyDecimal, 4, 2)
        numbersKeyBoard.addWidget(self.keyEqual, 4, 3)
        numbersKeyBoard.addWidget(self.keyPlus, 3, 3)
        numbersKeyBoard.addWidget(self.keyMinus, 2, 3)
        numbersKeyBoard.addWidget(self.keyTimes, 1, 3)
        numbersKeyBoard.addWidget(self.keyPercent, 0, 0)
        numbersKeyBoard.addWidget(self.keyClearEntry, 0, 1)
        numbersKeyBoard.addWidget(self.keyClear, 0, 2)
        numbersKeyBoard.addWidget(self.keyDel, 0, 3)

        for key in range(numberOfKeyNumber):
            for row in range(keyBoardRow):
                for column in range(keyBoardColumn):
                    numbersKeyBoard.addWidget(self.keyNumber[key], row, column) if row !=4 and column < 3 else numbersKeyBoard.addWidget(self.keyNumber[0], row, 1)

        layout.addWidget(self.rememNumLabel)
        self.rememNumLabel.setAlignment(Qt.AlignmentFlag.AlignRight)
        layout.addWidget(self.recentNumLabel)
        self.recentNumLabel.setAlignment(Qt.AlignmentFlag.AlignRight)

        layout.addLayout(numbersKeyBoard)

    def keyNumberClicked(self, num):
        self.recentNum.append(num)
        self.recentNumLabel.setText(''.join(map(str, self.recentNum)))

    def toNextNum(self):
        if self.mathClikedTime <= 1:
            self.recentNum, self.memoryNumber = self.memoryNumber, self.recentNum
            self.recentNumLabel.setText(''.join(map(str, self.recentNum)))
            self.rememNumLabel.setText(''.join(map(str, self.memoryNumber)))
            self.mathClikedTime = 1

    def keyDivideCliked(self):
        self.mathClikedTime = 1
        self.math = 'divide'
        self.toNextNum()

    def keyPlusCliked(self):
        self.mathClikedTime = 1
        self.math = 'plus'
        self.toNextNum()

    def keyTimesCliked(self):
        self.mathClikedTime = 1
        self.math = 'times'
        self.toNextNum()

    def keyMinusCliked(self):
        self.mathClikedTime = 1
        self.math = 'minus'
        self.toNextNum()

    def keyDecimalClicked(self):
        if not '.' in self.recentNum:
            self.recentNum.append('.')
            self.recentNumLabel.setText(''.join(map(str, self.recentNum)))

    def NegativePositive(self, firstChar):
        self.recentNum.pop(0) if firstChar == '-' else self.recentNum.insert(0, '-')
        self.recentNumLabel.setText(''.join(map(str,self.recentNum)))

    def keyNegativePositiveClicked(self):
        if self.recentNum:
            firstChar = self.recentNum[0]
            self.NegativePositive(firstChar)

    def keyDelClicked(self):
        if self.recentNum:
            self.recentNum.pop()
            self.recentNumLabel.setText(''.join(map(str,self.recentNum)))

    def keyClearClicked(self):
        self.recentNum, self.memoryNumber = list(), list()
        self.recentNumLabel.setText(''.join(map(str,self.recentNum)))
        self.rememNumLabel.setText(''.join(map(str,self.memoryNumber)))

    def keyClearEntryClicked(self):
        self.recentNum = list()
        self.recentNumLabel.setText(''.join(map(str,self.recentNum)))

    def caculateDivide(self):
        try:
            divide = float(''.join(map(str, self.memoryNumber))) / float(''.join(map(str, self.recentNum)))
            return divide
        except ZeroDivisionError:
            return 'Cant divide to zero'

    def caculatePlus(self):
        plus = float(''.join(map(str, self.memoryNumber))) + float(''.join(map(str, self.recentNum)))
        return plus

    def caculateTimes(self):
        times = float(''.join(map(str, self.memoryNumber))) * float(''.join(map(str, self.recentNum)))
        return times

    def caculateMinus(self):
        minus = float(''.join(map(str, self.memoryNumber))) - float(''.join(map(str, self.recentNum)))
        return minus

    def equalSetText(self):
        self.recentNumLabel.setText(''.join(map(str,self.recentNum)))
        self.rememNumLabel.setText("")
        self.memoryNumber = []
        self.math = ''

    def keyEqualClicked(self):
        if self.math == 'divide':
            result = self.caculateDivide()
        elif self.math == 'plus':
            result = self.caculatePlus()
        elif self.math == 'times':
            result = self.caculateTimes()
        elif self.math == 'minus':
            result = self.caculateMinus()
        else:
            return

        self.recentNum = list(str(result))
        self.recentNumLabel.setText(''.join(map(str,self.recentNum)))
        self.equalSetText()
        self.mathClikedTime = 0

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
Enter fullscreen mode Exit fullscreen mode

Top comments (0)