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())
Top comments (0)