mirror of
https://github.com/pythonguis/pythonguis-examples.git
synced 2025-01-13 16:42:55 +08:00
b74592ea41
Break down examples into module files to make easier to read. Use full-definitions on Enums (PyQt6 compatible, better documenting). Add fixes for Qt6 versions & some general bugfixes.
111 lines
3.0 KiB
Python
111 lines
3.0 KiB
Python
import operator
|
|
import sys
|
|
|
|
from MainWindow import Ui_MainWindow
|
|
from PyQt5.QtWidgets import QApplication, QMainWindow
|
|
|
|
# Calculator state.
|
|
READY = 0
|
|
INPUT = 1
|
|
|
|
|
|
class MainWindow(QMainWindow, Ui_MainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setupUi(self)
|
|
|
|
# Setup numbers.
|
|
for n in range(0, 10):
|
|
getattr(self, "pushButton_n%s" % n).pressed.connect(lambda v=n: self.input_number(v))
|
|
|
|
# Setup operations.
|
|
self.pushButton_add.pressed.connect(lambda: self.operation(operator.add))
|
|
self.pushButton_sub.pressed.connect(lambda: self.operation(operator.sub))
|
|
self.pushButton_mul.pressed.connect(lambda: self.operation(operator.mul))
|
|
self.pushButton_div.pressed.connect(lambda: self.operation(operator.truediv)) # operator.div for Python2.7
|
|
|
|
self.pushButton_pc.pressed.connect(self.operation_pc)
|
|
self.pushButton_eq.pressed.connect(self.equals)
|
|
|
|
# Setup actions
|
|
self.actionReset.triggered.connect(self.reset)
|
|
self.pushButton_ac.pressed.connect(self.reset)
|
|
|
|
self.actionExit.triggered.connect(self.close)
|
|
|
|
self.pushButton_m.pressed.connect(self.memory_store)
|
|
self.pushButton_mr.pressed.connect(self.memory_recall)
|
|
|
|
self.memory = 0
|
|
self.reset()
|
|
|
|
self.show()
|
|
|
|
def display(self):
|
|
self.lcdNumber.display(self.stack[-1])
|
|
|
|
def reset(self):
|
|
self.state = READY
|
|
self.stack = [0]
|
|
self.last_operation = None
|
|
self.current_op = None
|
|
self.display()
|
|
|
|
def memory_store(self):
|
|
self.memory = self.lcdNumber.value()
|
|
|
|
def memory_recall(self):
|
|
self.state = INPUT
|
|
self.stack[-1] = self.memory
|
|
self.display()
|
|
|
|
def input_number(self, v):
|
|
if self.state == READY:
|
|
self.state = INPUT
|
|
self.stack[-1] = v
|
|
else:
|
|
self.stack[-1] = self.stack[-1] * 10 + v
|
|
|
|
self.display()
|
|
|
|
def operation(self, op):
|
|
if self.current_op: # Complete the current operation
|
|
self.equals()
|
|
|
|
self.stack.append(0)
|
|
self.state = INPUT
|
|
self.current_op = op
|
|
|
|
def operation_pc(self):
|
|
self.state = INPUT
|
|
self.stack[-1] *= 0.01
|
|
self.display()
|
|
|
|
def equals(self):
|
|
# Support to allow '=' to repeat previous operation
|
|
# if no further input has been added.
|
|
if self.state == READY and self.last_operation:
|
|
s, self.current_op = self.last_operation
|
|
self.stack.append(s)
|
|
|
|
if self.current_op:
|
|
self.last_operation = self.stack[-1], self.current_op
|
|
|
|
try:
|
|
self.stack = [self.current_op(*self.stack)]
|
|
except Exception:
|
|
self.lcdNumber.display("Err")
|
|
self.stack = [0]
|
|
else:
|
|
self.current_op = None
|
|
self.state = READY
|
|
self.display()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication(sys.argv)
|
|
app.setApplicationName("Calculon")
|
|
|
|
window = MainWindow()
|
|
app.exec_()
|