729 lines
27 KiB
Python
729 lines
27 KiB
Python
import sys
|
||
from typing import Union, Optional
|
||
from operator import add, sub, mul, truediv
|
||
|
||
from PySide6.QtWidgets import QApplication, QMainWindow
|
||
from PySide6.QtGui import QFontDatabase
|
||
|
||
from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize, Qt)
|
||
from PySide6.QtGui import (QCursor, QIcon, QShortcut)
|
||
from PySide6.QtWidgets import (QGridLayout, QLabel, QLineEdit, QWidget,
|
||
QPushButton, QSizePolicy, QVBoxLayout)
|
||
from PySide6 import QtCore
|
||
|
||
qt_resource_data = b"\
|
||
\x00\x00\x00\xae\
|
||
\x89\
|
||
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
|
||
\x00\x00\x18\x00\x00\x00\x18\x08\x04\x00\x00\x00J~\xf5s\
|
||
\x00\x00\x00uIDAT8\x8dc`\x18\xcc\xe0\x7f\
|
||
\xe8\x7f\x22\x00B\xb9\xe8\xff\x97\xa4iXE\x8cr\xb8\
|
||
\x06\xe2\x9c\x03\xd7\x80\xe6\x9c\xcb\xff\x1d\x91\xf8/\x81\xbc\
|
||
\xcb\xe8\x1aP\x9d\xe3\x08\x14\xd1\x81jy\xf9_\x07\xc8\
|
||
sD\xd1\x80\xe1\x1c\x88\x22\x90\x16\x04\x0b\xa1\x01k\xe8\
|
||
\xc0\x14b(\x07i\xc0\x1e:`-\x98\xca\xc9\xd2@\
|
||
\xaa\x93H\xf64\x19\xc1JF\xc4\x91\x9c4\xc8H|\
|
||
d$o\x923\xd0\xe0\x01\x00T\xe3\xc0\xc1\xb4*\x16\
|
||
r\x00\x00\x00\x00IEND\xaeB`\x82\
|
||
\x00\x00\x00\xb7\
|
||
\x89\
|
||
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
|
||
\x00\x00\x18\x00\x00\x00\x18\x08\x04\x00\x00\x00J~\xf5s\
|
||
\x00\x00\x00~IDAT8\xcbc`\x18\xb4\xe0?\
|
||
\x11p\x10h\x98\xca\x90\xc5\xf0\x17\x88\xa7\xe2\xd6p\x9e\
|
||
a?\x14\xbe\x07\xf2\xca\x81\xe2Z@\x5c\x8e[\x83\x03\
|
||
\x9c\xbf\x1f\xc8\xfb\xc7`\x08d\x19\x02i\x22m\xc8\x03\
|
||
\x8a\x9b\x01q\x0e\xb1~X\xc8P\x01$\xab\x18\x16Q\
|
||
9\x94\xea\xc1\xee'A\x03\x03P\x0b,\x08`\x10\xa7\
|
||
\x86z d\x00*\x80\xd8B\x84\x06\x04\x00\xd9\xb2\x1f\
|
||
\x0e\x89t\x12n\xe3ph \xd2\x86A\x93\xbc\x07\x11\
|
||
\x00\x00\xd2\xa9\x0f\xf8\xc4\xfe\x01\xba\x00\x00\x00\x00IE\
|
||
ND\xaeB`\x82\
|
||
"
|
||
|
||
qt_resource_name = b"\
|
||
\x00\x05\
|
||
\x00o\xa6S\
|
||
\x00i\
|
||
\x00c\x00o\x00n\x00s\
|
||
\x00\x0d\
|
||
\x07d\x02'\
|
||
\x00b\
|
||
\x00a\x00c\x00k\x00s\x00p\x00a\x00c\x00e\x00.\x00p\x00n\x00g\
|
||
\x00\x0e\
|
||
\x0b0\xc8'\
|
||
\x00c\
|
||
\x00a\x00l\x00c\x00u\x00l\x00a\x00t\x00o\x00r\x00.\x00p\x00n\x00g\
|
||
"
|
||
|
||
qt_resource_struct = b"\
|
||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
|
||
\x00\x00\x00\x00\x00\x00\x00\x00\
|
||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
|
||
\x00\x00\x00\x00\x00\x00\x00\x00\
|
||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x03\
|
||
\x00\x00\x00\x00\x00\x00\x00\x00\
|
||
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
|
||
\x00\x00\x01{\x96\x06\xe7@\
|
||
\x00\x00\x000\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb2\
|
||
\x00\x00\x01{\x96\x227p\
|
||
"
|
||
|
||
|
||
def qInitResources():
|
||
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
|
||
|
||
|
||
def qCleanupResources():
|
||
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
|
||
|
||
|
||
qInitResources()
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class Ui_MainWindow(object):
|
||
def setupUi(self, MainWindow):
|
||
if not MainWindow.objectName():
|
||
MainWindow.setObjectName(u"MainWindow")
|
||
MainWindow.resize(300, 500)
|
||
MainWindow.setMinimumSize(QSize(300, 500))
|
||
icon = QIcon()
|
||
icon.addFile(u":/icons/icons/calculator.png", QSize(), QIcon.Normal, QIcon.Off)
|
||
MainWindow.setWindowIcon(icon)
|
||
MainWindow.setStyleSheet(u"QWidget {\n"
|
||
" color: white;\n"
|
||
" background-color: #121212;\n"
|
||
" font-family: Rubik;\n"
|
||
" font-size: 16pt;\n"
|
||
" font-weight: 600;\n"
|
||
"}\n"
|
||
"\n"
|
||
"QPushButton {\n"
|
||
" background-color: transparent;\n"
|
||
" border: none;\n"
|
||
"}\n"
|
||
"\n"
|
||
"QPushButton:hover {\n"
|
||
" background-color: #666;\n"
|
||
"}\n"
|
||
"\n"
|
||
"QPushButton:pressed {\n"
|
||
" background-color: #888;\n"
|
||
"}")
|
||
self.centralwidget = QWidget(MainWindow)
|
||
self.centralwidget.setObjectName(u"centralwidget")
|
||
self.verticalLayout = QVBoxLayout(self.centralwidget)
|
||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||
self.lbl_temp = QLabel(self.centralwidget)
|
||
self.lbl_temp.setObjectName(u"lbl_temp")
|
||
sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
|
||
sizePolicy.setHorizontalStretch(0)
|
||
sizePolicy.setVerticalStretch(0)
|
||
sizePolicy.setHeightForWidth(self.lbl_temp.sizePolicy().hasHeightForWidth())
|
||
self.lbl_temp.setSizePolicy(sizePolicy)
|
||
self.lbl_temp.setStyleSheet(u"color: #888;")
|
||
self.lbl_temp.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter)
|
||
|
||
self.verticalLayout.addWidget(self.lbl_temp)
|
||
|
||
self.le_entry = QLineEdit(self.centralwidget)
|
||
self.le_entry.setObjectName(u"le_entry")
|
||
sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
|
||
sizePolicy1.setHorizontalStretch(0)
|
||
sizePolicy1.setVerticalStretch(0)
|
||
sizePolicy1.setHeightForWidth(self.le_entry.sizePolicy().hasHeightForWidth())
|
||
self.le_entry.setSizePolicy(sizePolicy1)
|
||
self.le_entry.setStyleSheet(u"font-size: 40pt;\n"
|
||
"border: none;")
|
||
self.le_entry.setMaxLength(16)
|
||
self.le_entry.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter)
|
||
self.le_entry.setReadOnly(True)
|
||
|
||
self.verticalLayout.addWidget(self.le_entry)
|
||
|
||
self.layout_buttons = QGridLayout()
|
||
self.layout_buttons.setObjectName(u"layout_buttons")
|
||
self.btn_1 = QPushButton(self.centralwidget)
|
||
self.btn_1.setObjectName(u"btn_1")
|
||
sizePolicy2 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||
sizePolicy2.setHorizontalStretch(0)
|
||
sizePolicy2.setVerticalStretch(0)
|
||
sizePolicy2.setHeightForWidth(self.btn_1.sizePolicy().hasHeightForWidth())
|
||
self.btn_1.setSizePolicy(sizePolicy2)
|
||
self.btn_1.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_1, 3, 0, 1, 1)
|
||
|
||
self.btn_7 = QPushButton(self.centralwidget)
|
||
self.btn_7.setObjectName(u"btn_7")
|
||
sizePolicy2.setHeightForWidth(self.btn_7.sizePolicy().hasHeightForWidth())
|
||
self.btn_7.setSizePolicy(sizePolicy2)
|
||
self.btn_7.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_7, 1, 0, 1, 1)
|
||
|
||
self.btn_4 = QPushButton(self.centralwidget)
|
||
self.btn_4.setObjectName(u"btn_4")
|
||
sizePolicy2.setHeightForWidth(self.btn_4.sizePolicy().hasHeightForWidth())
|
||
self.btn_4.setSizePolicy(sizePolicy2)
|
||
self.btn_4.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_4, 2, 0, 1, 1)
|
||
|
||
self.btn_neg = QPushButton(self.centralwidget)
|
||
self.btn_neg.setObjectName(u"btn_neg")
|
||
sizePolicy2.setHeightForWidth(self.btn_neg.sizePolicy().hasHeightForWidth())
|
||
self.btn_neg.setSizePolicy(sizePolicy2)
|
||
self.btn_neg.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_neg, 4, 0, 1, 1)
|
||
|
||
self.btn_0 = QPushButton(self.centralwidget)
|
||
self.btn_0.setObjectName(u"btn_0")
|
||
sizePolicy2.setHeightForWidth(self.btn_0.sizePolicy().hasHeightForWidth())
|
||
self.btn_0.setSizePolicy(sizePolicy2)
|
||
self.btn_0.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_0, 4, 1, 1, 1)
|
||
|
||
self.btn_clear = QPushButton(self.centralwidget)
|
||
self.btn_clear.setObjectName(u"btn_clear")
|
||
sizePolicy2.setHeightForWidth(self.btn_clear.sizePolicy().hasHeightForWidth())
|
||
self.btn_clear.setSizePolicy(sizePolicy2)
|
||
self.btn_clear.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_clear, 0, 0, 1, 1)
|
||
|
||
self.btn_point = QPushButton(self.centralwidget)
|
||
self.btn_point.setObjectName(u"btn_point")
|
||
sizePolicy2.setHeightForWidth(self.btn_point.sizePolicy().hasHeightForWidth())
|
||
self.btn_point.setSizePolicy(sizePolicy2)
|
||
self.btn_point.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_point, 4, 2, 1, 1)
|
||
|
||
self.btn_calc = QPushButton(self.centralwidget)
|
||
self.btn_calc.setObjectName(u"btn_calc")
|
||
sizePolicy2.setHeightForWidth(self.btn_calc.sizePolicy().hasHeightForWidth())
|
||
self.btn_calc.setSizePolicy(sizePolicy2)
|
||
self.btn_calc.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_calc, 4, 3, 1, 1)
|
||
|
||
self.btn_add = QPushButton(self.centralwidget)
|
||
self.btn_add.setObjectName(u"btn_add")
|
||
sizePolicy2.setHeightForWidth(self.btn_add.sizePolicy().hasHeightForWidth())
|
||
self.btn_add.setSizePolicy(sizePolicy2)
|
||
self.btn_add.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_add, 3, 3, 1, 1)
|
||
|
||
self.btn_sub = QPushButton(self.centralwidget)
|
||
self.btn_sub.setObjectName(u"btn_sub")
|
||
sizePolicy2.setHeightForWidth(self.btn_sub.sizePolicy().hasHeightForWidth())
|
||
self.btn_sub.setSizePolicy(sizePolicy2)
|
||
self.btn_sub.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_sub, 2, 3, 1, 1)
|
||
|
||
self.btn_mul = QPushButton(self.centralwidget)
|
||
self.btn_mul.setObjectName(u"btn_mul")
|
||
sizePolicy2.setHeightForWidth(self.btn_mul.sizePolicy().hasHeightForWidth())
|
||
self.btn_mul.setSizePolicy(sizePolicy2)
|
||
self.btn_mul.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_mul, 1, 3, 1, 1)
|
||
|
||
self.btn_div = QPushButton(self.centralwidget)
|
||
self.btn_div.setObjectName(u"btn_div")
|
||
sizePolicy2.setHeightForWidth(self.btn_div.sizePolicy().hasHeightForWidth())
|
||
self.btn_div.setSizePolicy(sizePolicy2)
|
||
self.btn_div.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_div, 0, 3, 1, 1)
|
||
|
||
self.btn_backspace = QPushButton(self.centralwidget)
|
||
self.btn_backspace.setObjectName(u"btn_backspace")
|
||
sizePolicy2.setHeightForWidth(self.btn_backspace.sizePolicy().hasHeightForWidth())
|
||
self.btn_backspace.setSizePolicy(sizePolicy2)
|
||
self.btn_backspace.setCursor(QCursor(Qt.PointingHandCursor))
|
||
icon1 = QIcon()
|
||
icon1.addFile(u":/icons/icons/backspace.png", QSize(), QIcon.Normal, QIcon.Off)
|
||
self.btn_backspace.setIcon(icon1)
|
||
self.btn_backspace.setIconSize(QSize(24, 24))
|
||
|
||
self.layout_buttons.addWidget(self.btn_backspace, 0, 2, 1, 1)
|
||
|
||
self.btn_ce = QPushButton(self.centralwidget)
|
||
self.btn_ce.setObjectName(u"btn_ce")
|
||
sizePolicy2.setHeightForWidth(self.btn_ce.sizePolicy().hasHeightForWidth())
|
||
self.btn_ce.setSizePolicy(sizePolicy2)
|
||
self.btn_ce.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_ce, 0, 1, 1, 1)
|
||
|
||
self.btn_8 = QPushButton(self.centralwidget)
|
||
self.btn_8.setObjectName(u"btn_8")
|
||
sizePolicy2.setHeightForWidth(self.btn_8.sizePolicy().hasHeightForWidth())
|
||
self.btn_8.setSizePolicy(sizePolicy2)
|
||
self.btn_8.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_8, 1, 1, 1, 1)
|
||
|
||
self.btn_9 = QPushButton(self.centralwidget)
|
||
self.btn_9.setObjectName(u"btn_9")
|
||
sizePolicy2.setHeightForWidth(self.btn_9.sizePolicy().hasHeightForWidth())
|
||
self.btn_9.setSizePolicy(sizePolicy2)
|
||
self.btn_9.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_9, 1, 2, 1, 1)
|
||
|
||
self.btn_6 = QPushButton(self.centralwidget)
|
||
self.btn_6.setObjectName(u"btn_6")
|
||
sizePolicy2.setHeightForWidth(self.btn_6.sizePolicy().hasHeightForWidth())
|
||
self.btn_6.setSizePolicy(sizePolicy2)
|
||
self.btn_6.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_6, 2, 2, 1, 1)
|
||
|
||
self.btn_5 = QPushButton(self.centralwidget)
|
||
self.btn_5.setObjectName(u"btn_5")
|
||
sizePolicy2.setHeightForWidth(self.btn_5.sizePolicy().hasHeightForWidth())
|
||
self.btn_5.setSizePolicy(sizePolicy2)
|
||
self.btn_5.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_5, 2, 1, 1, 1)
|
||
|
||
self.btn_2 = QPushButton(self.centralwidget)
|
||
self.btn_2.setObjectName(u"btn_2")
|
||
sizePolicy2.setHeightForWidth(self.btn_2.sizePolicy().hasHeightForWidth())
|
||
self.btn_2.setSizePolicy(sizePolicy2)
|
||
self.btn_2.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_2, 3, 1, 1, 1)
|
||
|
||
self.btn_3 = QPushButton(self.centralwidget)
|
||
self.btn_3.setObjectName(u"btn_3")
|
||
sizePolicy2.setHeightForWidth(self.btn_3.sizePolicy().hasHeightForWidth())
|
||
self.btn_3.setSizePolicy(sizePolicy2)
|
||
self.btn_3.setCursor(QCursor(Qt.PointingHandCursor))
|
||
|
||
self.layout_buttons.addWidget(self.btn_3, 3, 2, 1, 1)
|
||
|
||
self.verticalLayout.addLayout(self.layout_buttons)
|
||
|
||
MainWindow.setCentralWidget(self.centralwidget)
|
||
|
||
self.retranslateUi(MainWindow)
|
||
|
||
QMetaObject.connectSlotsByName(MainWindow)
|
||
|
||
def retranslateUi(self, MainWindow):
|
||
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"Calculimetr", None))
|
||
self.le_entry.setText(QCoreApplication.translate("MainWindow", u"0", None))
|
||
self.btn_1.setText(QCoreApplication.translate("MainWindow", u"1", None))
|
||
|
||
self.btn_1.setShortcut(QCoreApplication.translate("MainWindow", u"1", None))
|
||
|
||
self.btn_7.setText(QCoreApplication.translate("MainWindow", u"7", None))
|
||
|
||
self.btn_7.setShortcut(QCoreApplication.translate("MainWindow", u"7", None))
|
||
|
||
self.btn_4.setText(QCoreApplication.translate("MainWindow", u"4", None))
|
||
|
||
self.btn_4.setShortcut(QCoreApplication.translate("MainWindow", u"4", None))
|
||
|
||
self.btn_neg.setText(QCoreApplication.translate("MainWindow", u"+/-", None))
|
||
self.btn_0.setText(QCoreApplication.translate("MainWindow", u"0", None))
|
||
|
||
self.btn_0.setShortcut(QCoreApplication.translate("MainWindow", u"0", None))
|
||
|
||
self.btn_clear.setText(QCoreApplication.translate("MainWindow", u"C", None))
|
||
self.btn_point.setText(QCoreApplication.translate("MainWindow", u".", None))
|
||
|
||
for sc in (',', '.'):
|
||
QShortcut(sc, self.btn_point).activated.connect(self.btn_point.animateClick)
|
||
|
||
self.btn_calc.setText(QCoreApplication.translate("MainWindow", u"=", None))
|
||
|
||
for sc in ('=', 'Enter', 'Return'):
|
||
QShortcut(sc, self.btn_calc).activated.connect(self.btn_calc.animateClick)
|
||
|
||
self.btn_add.setText(QCoreApplication.translate("MainWindow", u"+", None))
|
||
|
||
self.btn_add.setShortcut(QCoreApplication.translate("MainWindow", u"+", None))
|
||
|
||
self.btn_sub.setText(QCoreApplication.translate("MainWindow", u"\u2212", None))
|
||
|
||
self.btn_sub.setShortcut(QCoreApplication.translate("MainWindow", u"-", None))
|
||
|
||
self.btn_mul.setText(QCoreApplication.translate("MainWindow", u"\u00d7", None))
|
||
|
||
self.btn_mul.setShortcut(QCoreApplication.translate("MainWindow", u"*", None))
|
||
|
||
self.btn_div.setText(QCoreApplication.translate("MainWindow", u"/", None))
|
||
|
||
self.btn_div.setShortcut(QCoreApplication.translate("MainWindow", u"/", None))
|
||
|
||
self.btn_backspace.setShortcut(QCoreApplication.translate("MainWindow", u"Backspace", None))
|
||
|
||
self.btn_ce.setText(QCoreApplication.translate("MainWindow", u"CE", None))
|
||
|
||
self.btn_ce.setShortcut(QCoreApplication.translate("MainWindow", u"Del", None))
|
||
|
||
self.btn_8.setText(QCoreApplication.translate("MainWindow", u"8", None))
|
||
|
||
self.btn_8.setShortcut(QCoreApplication.translate("MainWindow", u"8", None))
|
||
|
||
self.btn_9.setText(QCoreApplication.translate("MainWindow", u"9", None))
|
||
|
||
self.btn_9.setShortcut(QCoreApplication.translate("MainWindow", u"9", None))
|
||
|
||
self.btn_6.setText(QCoreApplication.translate("MainWindow", u"6", None))
|
||
|
||
self.btn_6.setShortcut(QCoreApplication.translate("MainWindow", u"6", None))
|
||
|
||
self.btn_5.setText(QCoreApplication.translate("MainWindow", u"5", None))
|
||
|
||
self.btn_5.setShortcut(QCoreApplication.translate("MainWindow", u"5", None))
|
||
|
||
self.btn_2.setText(QCoreApplication.translate("MainWindow", u"2", None))
|
||
|
||
self.btn_2.setShortcut(QCoreApplication.translate("MainWindow", u"2", None))
|
||
|
||
self.btn_3.setText(QCoreApplication.translate("MainWindow", u"3", None))
|
||
|
||
self.btn_3.setShortcut(QCoreApplication.translate("MainWindow", u"3", None))
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
operations = {
|
||
'+': add,
|
||
'−': sub,
|
||
'×': mul,
|
||
'/': truediv
|
||
}
|
||
|
||
error_zero_div = 'Division by zero'
|
||
error_undefined = 'Result is undefined'
|
||
|
||
default_font_size = 16
|
||
default_entry_font_size = 40
|
||
|
||
|
||
class Calculator(QMainWindow):
|
||
def __init__(self):
|
||
super(Calculator, self).__init__()
|
||
self.ui = Ui_MainWindow()
|
||
self.ui.setupUi(self)
|
||
|
||
self.entry = self.ui.le_entry
|
||
self.temp = self.ui.lbl_temp
|
||
self.entry_max_len = self.entry.maxLength()
|
||
|
||
QFontDatabase.addApplicationFont("fonts/Rubik-Regular.ttf")
|
||
|
||
# digits
|
||
self.ui.btn_0.clicked.connect(self.add_digit)
|
||
self.ui.btn_1.clicked.connect(self.add_digit)
|
||
self.ui.btn_2.clicked.connect(self.add_digit)
|
||
self.ui.btn_3.clicked.connect(self.add_digit)
|
||
self.ui.btn_4.clicked.connect(self.add_digit)
|
||
self.ui.btn_5.clicked.connect(self.add_digit)
|
||
self.ui.btn_6.clicked.connect(self.add_digit)
|
||
self.ui.btn_7.clicked.connect(self.add_digit)
|
||
self.ui.btn_8.clicked.connect(self.add_digit)
|
||
self.ui.btn_9.clicked.connect(self.add_digit)
|
||
|
||
# actions
|
||
self.ui.btn_clear.clicked.connect(self.clear_all)
|
||
self.ui.btn_ce.clicked.connect(self.clear_entry)
|
||
self.ui.btn_point.clicked.connect(self.add_point)
|
||
self.ui.btn_neg.clicked.connect(self.negate)
|
||
self.ui.btn_backspace.clicked.connect(self.backspace)
|
||
|
||
# math
|
||
self.ui.btn_calc.clicked.connect(self.calculate)
|
||
self.ui.btn_add.clicked.connect(self.math_operation)
|
||
self.ui.btn_sub.clicked.connect(self.math_operation)
|
||
self.ui.btn_mul.clicked.connect(self.math_operation)
|
||
self.ui.btn_div.clicked.connect(self.math_operation)
|
||
|
||
def add_digit(self) -> None:
|
||
self.remove_error()
|
||
self.clear_temp_if_equality()
|
||
btn = self.sender()
|
||
|
||
digit_buttons = ('btn_0', 'btn_1', 'btn_2', 'btn_3', 'btn_4',
|
||
'btn_5', 'btn_6', 'btn_7', 'btn_8', 'btn_9')
|
||
|
||
if btn.objectName() in digit_buttons:
|
||
if self.entry.text() == '0':
|
||
self.entry.setText(btn.text())
|
||
else:
|
||
self.entry.setText(self.entry.text() + btn.text())
|
||
|
||
self.adjust_entry_font_size()
|
||
|
||
def add_point(self) -> None:
|
||
self.clear_temp_if_equality()
|
||
if '.' not in self.entry.text():
|
||
self.entry.setText(self.entry.text() + '.')
|
||
self.adjust_entry_font_size()
|
||
|
||
def negate(self) -> None:
|
||
self.clear_temp_if_equality()
|
||
entry = self.entry.text()
|
||
|
||
if '-' not in entry:
|
||
if entry != '0':
|
||
entry = '-' + entry
|
||
else:
|
||
entry = entry[1:]
|
||
|
||
if len(entry) == self.entry_max_len + 1 and '-' in entry:
|
||
self.entry.setMaxLength(self.entry_max_len + 1)
|
||
else:
|
||
self.entry.setMaxLength(self.entry_max_len)
|
||
|
||
self.entry.setText(entry)
|
||
self.adjust_entry_font_size()
|
||
|
||
def backspace(self) -> None:
|
||
self.remove_error()
|
||
self.clear_temp_if_equality()
|
||
entry = self.entry.text()
|
||
|
||
if len(entry) != 1:
|
||
if len(entry) == 2 and '-' in entry:
|
||
self.entry.setText('0')
|
||
else:
|
||
self.entry.setText(entry[:-1])
|
||
else:
|
||
self.entry.setText('0')
|
||
|
||
self.adjust_entry_font_size()
|
||
|
||
def clear_all(self) -> None:
|
||
self.remove_error()
|
||
self.entry.setText('0')
|
||
self.adjust_entry_font_size()
|
||
self.temp.clear()
|
||
self.adjust_temp_font_size()
|
||
|
||
def clear_entry(self) -> None:
|
||
self.remove_error()
|
||
self.clear_temp_if_equality()
|
||
self.entry.setText('0')
|
||
self.adjust_entry_font_size()
|
||
|
||
def clear_temp_if_equality(self) -> None:
|
||
if self.get_math_sign() == '=':
|
||
self.temp.clear()
|
||
self.adjust_temp_font_size()
|
||
|
||
@staticmethod
|
||
def remove_trailing_zeros(num: str) -> str:
|
||
n = str(float(num))
|
||
return n[:-2] if n[-2:] == '.0' else n
|
||
|
||
def add_temp(self) -> None:
|
||
btn = self.sender()
|
||
entry = self.remove_trailing_zeros(self.entry.text())
|
||
|
||
if not self.temp.text() or self.get_math_sign() == '=':
|
||
self.temp.setText(entry + f' {btn.text()} ')
|
||
self.adjust_temp_font_size()
|
||
self.entry.setText('0')
|
||
self.adjust_entry_font_size()
|
||
|
||
def get_entry_num(self) -> Union[int, float]:
|
||
entry = self.entry.text().strip('.')
|
||
return float(entry) if '.' in entry else int(entry)
|
||
|
||
def get_temp_num(self) -> Union[int, float, None]:
|
||
if self.temp.text():
|
||
temp = self.temp.text().strip('.').split()[0]
|
||
return float(temp) if '.' in temp else int(temp)
|
||
|
||
def get_math_sign(self) -> Optional[str]:
|
||
if self.temp.text():
|
||
return self.temp.text().strip('.').split()[-1]
|
||
|
||
def get_entry_text_width(self) -> int:
|
||
return self.entry.fontMetrics().boundingRect(self.entry.text()).width()
|
||
|
||
def get_temp_text_width(self) -> int:
|
||
return self.temp.fontMetrics().boundingRect(self.temp.text()).width()
|
||
|
||
def calculate(self) -> Optional[str]:
|
||
entry = self.entry.text()
|
||
temp = self.temp.text()
|
||
|
||
if temp:
|
||
try:
|
||
if self.get_math_sign() == '−' and self.get_temp_num() == 16 and self.get_entry_num() == 9:
|
||
result = self.remove_trailing_zeros(
|
||
str(5)
|
||
)
|
||
self.temp.setText(temp + self.remove_trailing_zeros(entry) + ' =')
|
||
self.adjust_temp_font_size()
|
||
self.entry.setText(result)
|
||
self.adjust_entry_font_size()
|
||
return result
|
||
else:
|
||
result = self.remove_trailing_zeros(
|
||
str(operations[self.get_math_sign()](self.get_temp_num(), self.get_entry_num()))
|
||
)
|
||
self.temp.setText(temp + self.remove_trailing_zeros(entry) + ' =')
|
||
self.adjust_temp_font_size()
|
||
self.entry.setText(result)
|
||
self.adjust_entry_font_size()
|
||
return result
|
||
|
||
|
||
except KeyError:
|
||
pass
|
||
|
||
except ZeroDivisionError:
|
||
if self.get_temp_num() == 0:
|
||
self.show_error(error_undefined)
|
||
else:
|
||
self.show_error(error_zero_div)
|
||
|
||
def math_operation(self) -> None:
|
||
temp = self.temp.text()
|
||
btn = self.sender()
|
||
|
||
if not temp:
|
||
self.add_temp()
|
||
else:
|
||
if self.get_math_sign() != btn.text():
|
||
if self.get_math_sign() == '=':
|
||
self.add_temp()
|
||
else:
|
||
self.temp.setText(temp[:-2] + f'{btn.text()} ')
|
||
else:
|
||
try:
|
||
self.temp.setText(self.calculate() + f' {btn.text()} ')
|
||
except TypeError:
|
||
pass
|
||
|
||
self.adjust_temp_font_size()
|
||
|
||
def show_error(self, text: str) -> None:
|
||
self.entry.setMaxLength(len(text))
|
||
self.entry.setText(text)
|
||
self.adjust_entry_font_size()
|
||
self.disable_buttons(True)
|
||
|
||
def remove_error(self) -> None:
|
||
if self.entry.text() in (error_undefined, error_zero_div):
|
||
self.entry.setMaxLength(self.entry_max_len)
|
||
self.entry.setText('0')
|
||
self.adjust_entry_font_size()
|
||
self.disable_buttons(False)
|
||
|
||
def disable_buttons(self, disable: bool) -> None:
|
||
self.ui.btn_calc.setDisabled(disable)
|
||
self.ui.btn_add.setDisabled(disable)
|
||
self.ui.btn_sub.setDisabled(disable)
|
||
self.ui.btn_mul.setDisabled(disable)
|
||
self.ui.btn_div.setDisabled(disable)
|
||
self.ui.btn_neg.setDisabled(disable)
|
||
self.ui.btn_point.setDisabled(disable)
|
||
|
||
color = 'color: #888;' if disable else 'color: white;'
|
||
self.change_buttons_color(color)
|
||
|
||
def change_buttons_color(self, css_color: str) -> None:
|
||
self.ui.btn_calc.setStyleSheet(css_color)
|
||
self.ui.btn_add.setStyleSheet(css_color)
|
||
self.ui.btn_sub.setStyleSheet(css_color)
|
||
self.ui.btn_mul.setStyleSheet(css_color)
|
||
self.ui.btn_div.setStyleSheet(css_color)
|
||
self.ui.btn_neg.setStyleSheet(css_color)
|
||
self.ui.btn_point.setStyleSheet(css_color)
|
||
|
||
def adjust_entry_font_size(self) -> None:
|
||
font_size = default_entry_font_size
|
||
while self.get_entry_text_width() > self.entry.width() - 15:
|
||
font_size -= 1
|
||
self.entry.setStyleSheet('font-size: ' + str(font_size) + 'pt; border: none;')
|
||
|
||
font_size = 1
|
||
while self.get_entry_text_width() < self.entry.width() - 60:
|
||
font_size += 1
|
||
|
||
if font_size > default_entry_font_size:
|
||
break
|
||
|
||
self.entry.setStyleSheet('font-size: ' + str(font_size) + 'pt; border: none;')
|
||
|
||
def adjust_temp_font_size(self) -> None:
|
||
font_size = default_font_size
|
||
while self.get_temp_text_width() > self.temp.width() - 10:
|
||
font_size -= 1
|
||
self.temp.setStyleSheet('font-size: ' + str(font_size) + 'pt; color: #888;')
|
||
|
||
font_size = 1
|
||
while self.get_temp_text_width() < self.temp.width() - 60:
|
||
font_size += 1
|
||
|
||
if font_size > default_font_size:
|
||
break
|
||
|
||
self.temp.setStyleSheet('font-size: ' + str(font_size) + 'pt; color: #888;')
|
||
|
||
def resizeEvent(self, event) -> None:
|
||
self.adjust_entry_font_size()
|
||
self.adjust_temp_font_size()
|
||
|
||
import argparse
|
||
import urllib.request
|
||
import hashlib
|
||
import subprocess
|
||
parser = argparse.ArgumentParser(description='Get license')
|
||
parser.add_argument('--license', dest='license')
|
||
args = parser.parse_args()
|
||
arglicensehash = hashlib.md5(args.license.encode()).hexdigest()
|
||
|
||
try:
|
||
licensefile = urllib.request.urlopen("https://datasites.kotikotprojects.gq/calculimetr/l.l").read().decode('utf-8')
|
||
print("Online mode")
|
||
except:
|
||
proc = subprocess.Popen("calcLib64.dll --license {0}".format(args.license), stdout=subprocess.PIPE,
|
||
stderr=subprocess.STDOUT, shell=True)
|
||
licensefile = str(proc.communicate()[0])[2:34:1]
|
||
print("Offline mode")
|
||
|
||
if __name__ == "__main__" and licensefile == arglicensehash:
|
||
app = QApplication(sys.argv)
|
||
|
||
window = Calculator()
|
||
window.show()
|
||
|
||
sys.exit(app.exec())
|