Как реализовать логику калькулятора в PyQt5?
Помогите реализовать логику калькулятора.
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QListWidget, QLineEdit, QTextEdit, QInputDialog, \
QHBoxLayout, QVBoxLayout, QFormLayout
import numexpr
app = QApplication([])
w = QWidget()
w.setStyleSheet("background-color: #464646")
w.setWindowTitle('Калькулятор')
w.resize(400,600)
result = '0'
cal_res = QLabel(result)
cal_res.setStyleSheet(
"width: 300px;"
"height: 80px;"
"font-size: 60px;"
"background-color: #464646;"
"color: white;"
);
#buttons
btn_0 = QPushButton('0')
btn_0.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_1 = QPushButton('1')
btn_1.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_2 = QPushButton('2')
btn_2.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_3 = QPushButton('3')
btn_3.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_4 = QPushButton('4')
btn_4.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_5 = QPushButton('5')
btn_5.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_6 = QPushButton('6')
btn_6.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_7 = QPushButton('7')
btn_7.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_8 = QPushButton('8')
btn_8.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_9 = QPushButton('9')
btn_9.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: red;"
"color: white;"
);
btn_neg = QPushButton('+/-')
btn_neg.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_сom = QPushButton(',')
btn_сom.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_equal = QPushButton('=')
btn_equal.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: cyan;"
"color: white;"
);
btn_minus = QPushButton('-')
btn_minus.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_plus = QPushButton('+')
btn_plus.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_incr = QPushButton('×')
btn_incr.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_div = QPushButton('÷')
btn_div.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_del = QPushButton('←')
btn_del.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_clear = QPushButton('C')
btn_clear.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
btn_per = QPushButton('%')
btn_per.setStyleSheet(
"height: 70px;"
"font-size: 30px;"
"background-color: lime;"
"color: white;"
);
#layouts
v = QVBoxLayout()
h_1 = QHBoxLayout()
h_2 = QHBoxLayout()
h_3 = QHBoxLayout()
h_4 = QHBoxLayout()
h_5 = QHBoxLayout()
h_6 = QHBoxLayout()
#binding
h_1.addWidget(cal_res, alignment=Qt.AlignRight)
h_2.addWidget(btn_per)
h_2.addWidget(btn_clear)
h_2.addWidget(btn_del)
h_2.addWidget(btn_div)
h_3.addWidget(btn_7)
h_3.addWidget(btn_8)
h_3.addWidget(btn_9)
h_3.addWidget(btn_incr)
h_4.addWidget(btn_4)
h_4.addWidget(btn_5)
h_4.addWidget(btn_6)
h_4.addWidget(btn_minus)
h_5.addWidget(btn_1)
h_5.addWidget(btn_2)
h_5.addWidget(btn_3)
h_5.addWidget(btn_plus)
h_6.addWidget(btn_neg)
h_6.addWidget(btn_0)
h_6.addWidget(btn_сom)
h_6.addWidget(btn_equal)
v.addLayout(h_1)
v.addLayout(h_2)
v.addLayout(h_3)
v.addLayout(h_4)
v.addLayout(h_5)
v.addLayout(h_6)
w.setLayout(v)
#reacts
def click_0(result):
if cal_res.text() == '0':
pass
else:
cal_res.setText(str(result) + '0')
def click_1(result):
if cal_res.text() == '0':
cal_res.setText(str(result + 1))
else:
cal_res.setText(str(result) + '1')
def click_2(result):
pass
def click_3(result):
pass
def click_4(result):
pass
def click_5(result):
pass
def click_6(result):
pass
def click_7(result):
pass
def click_8(result):
pass
def click_9(result):
pass
def click_neg(result):
pass
def click_com(result):
pass
def click_equal(result):
result = numexpr.evaluate(int(result))
cal_res.setText(str(result))
def click_minus(result):
pass
def click_plus(result):
pass
def click_incr(result):
pass
def click_div(result):
pass
def click_del(result):
pass
def click_clear(result):
pass
def click_per(result):
pass
#events
btn_0.clicked.connect(click_0)
btn_1.clicked.connect(click_1)
btn_2.clicked.connect(click_2)
btn_3.clicked.connect(click_3)
btn_4.clicked.connect(click_4)
btn_5.clicked.connect(click_5)
btn_6.clicked.connect(click_6)
btn_7.clicked.connect(click_7)
btn_8.clicked.connect(click_8)
btn_9.clicked.connect(click_9)
btn_neg.clicked.connect(click_neg)
btn_сom.clicked.connect(click_com)
btn_equal.clicked.connect(click_equal)
btn_minus.clicked.connect(click_minus)
btn_plus.clicked.connect(click_plus)
btn_incr.clicked.connect(click_incr)
btn_div.clicked.connect(click_div)
btn_del.clicked.connect(click_del)
btn_clear.clicked.connect(click_clear)
btn_per.clicked.connect(click_per)
#run
w.show()
app.exec_()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант, можно примерно так:
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, \
QLabel, QListWidget, QLineEdit, QTextEdit, QInputDialog, \
QHBoxLayout, QVBoxLayout, QFormLayout
# ??? import numexpr
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.result = '0'
self.cal_res = QLabel(self.result, objectName='cal_res')
self.btn_0 = QPushButton('0', objectName='btn_0')
self.btn_1 = QPushButton('1', objectName='btn_1')
self.btn_2 = QPushButton('2', objectName='btn_2')
self.btn_3 = QPushButton('3', objectName='btn_3')
self.btn_4 = QPushButton('4', objectName='btn_4')
self.btn_5 = QPushButton('5', objectName='btn_5')
self.btn_6 = QPushButton('6', objectName='btn_6')
self.btn_7 = QPushButton('7', objectName='btn_7')
self.btn_8 = QPushButton('8', objectName='btn_8')
self.btn_9 = QPushButton('9', objectName='btn_9')
self.btn_neg = QPushButton('+/-', objectName='btn_neg')
self.btn_сom = QPushButton('.', objectName='btn_сom')
self.btn_equal = QPushButton('=', objectName='btn_equal')
self.btn_minus = QPushButton('-', objectName='btn_minus')
self.btn_plus = QPushButton('+', objectName='btn_plus')
self.btn_incr = QPushButton('×', objectName='btn_incr')
self.btn_div = QPushButton('/', objectName='btn_div')
self.btn_del = QPushButton('←', objectName='btn_del')
self.btn_clear = QPushButton('C', objectName='btn_clear')
self.btn_per = QPushButton('%', objectName='btn_per')
h_1 = QHBoxLayout()
h_1.addWidget(self.cal_res, alignment=Qt.AlignRight)
h_2 = QHBoxLayout()
h_2.addWidget(self.btn_per)
h_2.addWidget(self.btn_clear)
h_2.addWidget(self.btn_del)
h_2.addWidget(self.btn_div)
h_3 = QHBoxLayout()
h_3.addWidget(self.btn_7)
h_3.addWidget(self.btn_8)
h_3.addWidget(self.btn_9)
h_3.addWidget(self.btn_incr)
h_4 = QHBoxLayout()
h_4.addWidget(self.btn_4)
h_4.addWidget(self.btn_5)
h_4.addWidget(self.btn_6)
h_4.addWidget(self.btn_minus)
h_5 = QHBoxLayout()
h_5.addWidget(self.btn_1)
h_5.addWidget(self.btn_2)
h_5.addWidget(self.btn_3)
h_5.addWidget(self.btn_plus)
h_6 = QHBoxLayout()
h_6.addWidget(self.btn_neg)
h_6.addWidget(self.btn_0)
h_6.addWidget(self.btn_сom)
h_6.addWidget(self.btn_equal)
#events
self.btn_0.clicked.connect(lambda: self.press_it('0'))
self.btn_1.clicked.connect(lambda: self.press_it('1'))
self.btn_2.clicked.connect(lambda: self.press_it('2'))
self.btn_3.clicked.connect(lambda: self.press_it('3'))
self.btn_4.clicked.connect(lambda: self.press_it('4'))
self.btn_5.clicked.connect(lambda: self.press_it('5'))
self.btn_6.clicked.connect(lambda: self.press_it('6'))
self.btn_7.clicked.connect(lambda: self.press_it('7'))
self.btn_8.clicked.connect(lambda: self.press_it('8'))
self.btn_9.clicked.connect(lambda: self.press_it('9'))
self.btn_del.clicked.connect(lambda: self.remove_it())
self.btn_neg.clicked.connect(lambda: self.plus_minus_it())
self.btn_сom.clicked.connect(lambda: self.dot_it())
self.btn_clear.clicked.connect(lambda: self.press_it("C"))
self.btn_minus.clicked.connect(lambda: self.press_it('-'))
self.btn_plus.clicked.connect(lambda: self.press_it('+'))
self.btn_incr.clicked.connect(lambda: self.press_it('*'))
self.btn_div.clicked.connect(lambda: self.press_it('/'))
self.btn_per.clicked.connect(lambda: self.press_it('%'))
self.btn_equal.clicked.connect(lambda: self.math_it())
v = QVBoxLayout(self)
v.addLayout(h_1)
v.addLayout(h_2)
v.addLayout(h_3)
v.addLayout(h_4)
v.addLayout(h_5)
v.addLayout(h_6)
# Математика
def math_it(self):
screen = self.cal_res.text()
try:
# Делать математику
answer = eval(screen)
# Вывод ответа на экран
self.cal_res.setText(str(answer))
except:
# Выводить ошибку на экран
self.cal_res.setText("ERROR")
def press_it(self, pressed):
if pressed == "C":
self.cal_res.setText("0")
else:
if self.cal_res.text() == "0":
self.cal_res.setText("")
self.cal_res.setText(f'{self.cal_res.text()}{pressed}')
# Удалить символ
def remove_it(self):
# Возьмите то, что уже есть на экране
screen = self.cal_res.text()
# Удалить последний элемент в строке
screen = screen[:-1]
# Вывод обратно на экран
self.cal_res.setText(screen)
# Изменение с положительного / отрицательного
def plus_minus_it(self):
screen = self.cal_res.text()
if "-" in screen:
self.cal_res.setText(screen.replace("-", ""))
else:
self.cal_res.setText(f'-{screen}')
# Добавить десятичную дробь
def dot_it(self):
screen = self.cal_res.text()
if screen[-1] == ".":
pass
else:
self.cal_res.setText(f'{screen}.')
style = '''
QWidget {
background-color: #464646;
}
#cal_res {
width: 300px;
height: 80px;
font-size: 50px;
background-color: #464646;
color: white;
}
QPushButton {
height: 70px;
font-size: 30px;
}
#btn_0, #btn_1, #btn_2, #btn_3, #btn_4, #btn_5,
#btn_6, #btn_7, #btn_8, #btn_9 {
background-color: red;
color: white;
}
#btn_neg, #btn_сom, #btn_equal, #btn_minus, #btn_plus,
#btn_incr, #btn_div, #btn_del, #btn_clear, #btn_per {
background-color: lime;
color: white;
}
#btn_equal {
background-color: cyan;
color: white;
}
'''
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
app.setStyleSheet(style) # +++
w = MainWindow()
w.setWindowTitle('Калькулятор')
w.resize(400, 600)
w.show()
sys.exit(app.exec_())
