import sys import time 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 elif self.get_math_sign() == '−' and self.get_temp_num() == 1000 and self.get_entry_num() == 7: result = 'ZXC GHOUL' 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())