@@ -0,0 +1,728 @@
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 \x0d IHDR \x00 \
\x00 \x00 \x18 \x00 \x00 \x00 \x18 \x08 \x04 \x00 \x00 \x00 J~ \xf5 s \
\x00 \x00 \x00 uIDAT8 \x8d c` \x18 \xcc \xe0 \x7f \
\xe8 \x7f \x22 \x00 B \xb9 \xe8 \xff \x97 \xa4 iXE \x8c r \xb8 \
\x06 \xe2 \x9c \x03 \xd7 \x80 \xe6 \x9c \xcb \xff \x1d \x91 \xf8 / \x81 \xbc \
\xcb \xe8 \x1a P \x9d \xe3 \x08 \x14 \xd1 \x81 jy \xf9 _ \x07 \xc8 \
sD \xd1 \x80 \xe1 \x1c \x88 \x22 \x90 \x16 \x04 \x0b \xa1 \x01 k \xe8 \
\xc0 \x14 b( \x07 i \xc0 \x1e :`- \x98 \xca \xc9 \xd2 @ \
\xaa \x93 H \xf6 4 \x19 \xc1 JF \xc4 \x91 \x9c 4 \xc8 H| \
d$o \x92 3 \xd0 \xe0 \x01 \x00 T \xe3 \xc0 \xc1 \xb4 * \x16 \
r \x00 \x00 \x00 \x00 IEND \xae B` \x82 \
\x00 \x00 \x00 \xb7 \
\x89 \
PNG \x0d \x0a \x1a \x0a \x00 \x00 \x00 \x0d IHDR \x00 \
\x00 \x00 \x18 \x00 \x00 \x00 \x18 \x08 \x04 \x00 \x00 \x00 J~ \xf5 s \
\x00 \x00 \x00 ~IDAT8 \xcb c` \x18 \xb4 \xe0 ? \
\x11 p \x10 h \x98 \xca \x90 \xc5 \xf0 \x17 \x88 \xa7 \xe2 \xd6 p \x9e \
a? \x14 \xbe \x07 \xf2 \xca \x81 \xe2 Z@ \x5c \x8e [ \x83 \x03 \
\x9c \xbf \x1f \xc8 \xfb \xc7 ` \x08 d \x19 \x02 i \x22 m \xc8 \x03 \
\x8a \x9b \x01 q \x0e \xb1 ~X \xc8 P \x01 $ \xab \x18 \x16 Q \
9 \x94 \xea \xc1 \xee ' A \x03 \x03 P \x0b , \x08 ` \x10 \xa7 \
\x86 z d \x00 * \x80 \xd8 B \x84 \x06 \x04 \x00 \xd9 \xb2 \x1f \
\x0e \x89 t \x12 n \xe3 ph \xd2 \x86 A \x93 \xbc \x07 \x11 \
\x00 \x00 \xd2 \xa9 \x0f \xf8 \xc4 \xfe \x01 \xba \x00 \x00 \x00 \x00 IE \
ND \xae B` \x82 \
"
qt_resource_name = b " \
\x00 \x05 \
\x00 o \xa6 S \
\x00 i \
\x00 c \x00 o \x00 n \x00 s \
\x00 \x0d \
\x07 d \x02 ' \
\x00 b \
\x00 a \x00 c \x00 k \x00 s \x00 p \x00 a \x00 c \x00 e \x00 . \x00 p \x00 n \x00 g \
\x00 \x0e \
\x0b 0 \xc8 ' \
\x00 c \
\x00 a \x00 l \x00 c \x00 u \x00 l \x00 a \x00 t \x00 o \x00 r \x00 . \x00 p \x00 n \x00 g \
"
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 \x00 0 \x00 \x00 \x00 \x00 \x00 \x01 \x00 \x00 \x00 \xb2 \
\x00 \x00 \x01 { \x96 \x22 7p \
"
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 ( ) )