-
Notifications
You must be signed in to change notification settings - Fork 0
/
mycalc10.py
121 lines (91 loc) · 3.54 KB
/
mycalc10.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QLineEdit, QToolButton
from PyQt5.QtWidgets import QSizePolicy
from PyQt5.QtWidgets import QLayout, QGridLayout
from keypad import *
import calcFunctions4
class Button(QToolButton):
def __init__(self, text, callback):
super().__init__()
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.setText(text)
self.clicked.connect(callback)
def sizeHint(self):
size = super(Button, self).sizeHint()
size.setHeight(size.height() + 20)
size.setWidth(max(size.width(), size.height()))
return size
class Calculator(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# Display Window
self.display = QLineEdit()
self.display.setReadOnly(True)
self.display.setAlignment(Qt.AlignRight)
self.display.setMaxLength(15)
# Button Creation and Placement
numLayout = QGridLayout()
opLayout = QGridLayout()
constLayout = QGridLayout()
funcLayout = QGridLayout()
buttonGroups = {
'num': {'buttons': numPadList, 'layout': numLayout, 'columns': 3},
'op': {'buttons': operatorList, 'layout': opLayout, 'columns': 2},
'constants': {'buttons': constantList, 'layout': constLayout, 'columns': 1},
'functions': {'buttons': functionList, 'layout': funcLayout, 'columns': 1},
}
for label in buttonGroups.keys():
r = 0; c = 0
buttonPad = buttonGroups[label]
for btnText in buttonPad['buttons']:
button = Button(btnText, self.buttonClicked)
buttonPad['layout'].addWidget(button, r, c)
c += 1
if c >= buttonPad['columns']:
c = 0; r += 1
# Layout
mainLayout = QGridLayout()
mainLayout.setSizeConstraint(QLayout.SetFixedSize)
mainLayout.addWidget(self.display, 0, 0, 1, 2)
mainLayout.addLayout(numLayout, 1, 0)
mainLayout.addLayout(opLayout, 1, 1)
mainLayout.addLayout(constLayout, 2, 0)
mainLayout.addLayout(funcLayout, 2, 1)
self.setLayout(mainLayout)
self.setWindowTitle("My Calculator")
def buttonClicked(self):
if self.display.text() == 'Error!':
self.display.setText('')
button = self.sender()
key = button.text()
if key == '=':
try:
result = str(eval(self.display.text()))
except:
result = 'Error!'
self.display.setText(result)
elif key == 'C':
self.display.clear()
elif key in constantList:
for i in range(len(constantList)):
if key == constantList[i] :
self.display.setText(self.display.text() + constantMap[i])
elif key in functionList:
for i in range(len(functionList)):
if key ==functionList[i] :
n = self.display.text()
value = functionMap[i](n)
self.display.setText(str(value))
elif key =='-':
self.display.setText(self.display.text()+'-')
elif key =='<-':
self.display.setText(self.display.text()[:-1])
else:
self.display.setText(self.display.text() + key)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
calc = Calculator()
calc.show()
sys.exit(app.exec_())