Updated sls_calc module
This commit is contained in:
parent
d7164599f0
commit
8890216457
|
|
@ -12,7 +12,7 @@ class HPCalculator:
|
||||||
def __init__(self, root):
|
def __init__(self, root):
|
||||||
self.root = root
|
self.root = root
|
||||||
self.root.title("HP Stack Calculator")
|
self.root.title("HP Stack Calculator")
|
||||||
self.root.geometry("450x650")
|
# self.root.geometry("450x650")
|
||||||
self.root.resizable(False, False)
|
self.root.resizable(False, False)
|
||||||
|
|
||||||
# Initialize interpreter
|
# Initialize interpreter
|
||||||
|
|
@ -24,24 +24,8 @@ class HPCalculator:
|
||||||
self.is_new_entry = True
|
self.is_new_entry = True
|
||||||
|
|
||||||
# Set up UI
|
# Set up UI
|
||||||
self.setup_styles()
|
|
||||||
self.create_widgets()
|
self.create_widgets()
|
||||||
|
|
||||||
def setup_styles(self):
|
|
||||||
"""Configure custom styles for the calculator"""
|
|
||||||
style = ttk.Style()
|
|
||||||
style.theme_use('clam')
|
|
||||||
|
|
||||||
# Configure button styles
|
|
||||||
style.configure('Calc.TButton',
|
|
||||||
font=('Arial', 12, 'bold'),
|
|
||||||
padding=10)
|
|
||||||
style.configure('Display.TLabel',
|
|
||||||
font=('Courier', 14),
|
|
||||||
background='#f0f0f0',
|
|
||||||
relief='sunken',
|
|
||||||
padding=5)
|
|
||||||
|
|
||||||
def create_widgets(self):
|
def create_widgets(self):
|
||||||
"""Create all calculator widgets"""
|
"""Create all calculator widgets"""
|
||||||
# Main container
|
# Main container
|
||||||
|
|
@ -65,8 +49,7 @@ class HPCalculator:
|
||||||
self.stack_labels = []
|
self.stack_labels = []
|
||||||
for i in range(4):
|
for i in range(4):
|
||||||
label = ttk.Label(stack_frame,
|
label = ttk.Label(stack_frame,
|
||||||
text=f"T{3-i}: 0",
|
text=f"T{3-i}: <>",
|
||||||
style='Display.TLabel',
|
|
||||||
anchor='e',
|
anchor='e',
|
||||||
width=30)
|
width=30)
|
||||||
label.grid(row=i, column=0, sticky=(tk.W, tk.E), pady=2)
|
label.grid(row=i, column=0, sticky=(tk.W, tk.E), pady=2)
|
||||||
|
|
@ -79,45 +62,34 @@ class HPCalculator:
|
||||||
|
|
||||||
self.entry_label = ttk.Label(entry_frame,
|
self.entry_label = ttk.Label(entry_frame,
|
||||||
text="0",
|
text="0",
|
||||||
style='Display.TLabel',
|
|
||||||
anchor='e',
|
anchor='e',
|
||||||
font=('Courier', 16, 'bold'))
|
font=('Courier', 16))
|
||||||
self.entry_label.grid(row=0, column=0, sticky=(tk.W, tk.E))
|
self.entry_label.grid(row=0, column=0, sticky=(tk.W, tk.E))
|
||||||
|
|
||||||
def create_button_grid(self, parent):
|
def create_button_grid(self, parent):
|
||||||
"""Create the calculator button grid"""
|
"""Create the calculator button grid"""
|
||||||
buttons = [
|
buttons = [
|
||||||
# Row 1: Stack operations
|
[('√', self.sqrt), ('x²', self.square), ('1/x', self.reciprocal), ('NULL', lambda: None)],
|
||||||
[('√', self.sqrt), ('x²', self.square), ('1/x', self.reciprocal), ('÷', self.divide)],
|
[('ENTER', lambda: self.enter(True)), ('SWAP', self.swap), ('<-', self.drop), ('NULL', lambda: None)],
|
||||||
# Row 2: Numbers and operations
|
[('7', lambda: self.digit('7')), ('8', lambda: self.digit('8')), ('9', lambda: self.digit('9')), ('÷', self.divide)],
|
||||||
[('7', lambda: self.digit('7')), ('8', lambda: self.digit('8')),
|
[('4', lambda: self.digit('4')), ('5', lambda: self.digit('5')), ('6', lambda: self.digit('6')), ('×', self.multiply)],
|
||||||
('9', lambda: self.digit('9')), ('×', self.multiply)],
|
[('1', lambda: self.digit('1')), ('2', lambda: self.digit('2')), ('3', lambda: self.digit('3')), ('−', self.subtract)],
|
||||||
# Row 3
|
[('0', lambda: self.digit('0')), ('.', self.decimal), ('±', self.negate), ('+', self.add)],
|
||||||
[('4', lambda: self.digit('4')), ('5', lambda: self.digit('5')),
|
|
||||||
('6', lambda: self.digit('6')), ('−', self.subtract)],
|
|
||||||
# Row 4
|
|
||||||
[('1', lambda: self.digit('1')), ('2', lambda: self.digit('2')),
|
|
||||||
('3', lambda: self.digit('3')), ('+', self.add)],
|
|
||||||
# Row 5
|
|
||||||
[('0', lambda: self.digit('0')), ('.', self.decimal),
|
|
||||||
('±', self.negate), ('ENTER', self.enter)],
|
|
||||||
# Row 6: Special functions
|
|
||||||
[('SWAP', self.swap), ('DROP', self.drop),
|
|
||||||
('DUP', self.dup), ('CLR', self.clear)]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
for row_idx, row in enumerate(buttons, start=2):
|
for row_idx, row in enumerate(buttons, start=2):
|
||||||
for col_idx, (text, command) in enumerate(row):
|
for col_idx, (text, command) in enumerate(row):
|
||||||
|
if text != "NULL":
|
||||||
btn = ttk.Button(parent,
|
btn = ttk.Button(parent,
|
||||||
text=text,
|
text=text,
|
||||||
command=command,
|
command=command,
|
||||||
style='Calc.TButton',
|
|
||||||
width=8)
|
width=8)
|
||||||
btn.grid(row=row_idx, column=col_idx, padx=2, pady=2, sticky=(tk.W, tk.E, tk.N, tk.S))
|
btn.grid(row=row_idx, column=col_idx, padx=2, pady=2, sticky=(tk.W, tk.E, tk.N, tk.S))
|
||||||
|
|
||||||
# Keyboard bindings
|
# Keyboard bindings
|
||||||
self.root.bind('<Return>', lambda e: self.enter())
|
self.root.bind('<Delete>', lambda e: self.drop())
|
||||||
self.root.bind('<KP_Enter>', lambda e: self.enter())
|
self.root.bind('<Return>', lambda e: self.enter(True))
|
||||||
|
self.root.bind('<KP_Enter>', lambda e: self.enter(True))
|
||||||
for i in range(10):
|
for i in range(10):
|
||||||
self.root.bind(str(i), lambda e, n=str(i): self.digit(n))
|
self.root.bind(str(i), lambda e, n=str(i): self.digit(n))
|
||||||
self.root.bind('.', lambda e: self.decimal())
|
self.root.bind('.', lambda e: self.decimal())
|
||||||
|
|
@ -125,7 +97,6 @@ class HPCalculator:
|
||||||
self.root.bind('-', lambda e: self.subtract())
|
self.root.bind('-', lambda e: self.subtract())
|
||||||
self.root.bind('*', lambda e: self.multiply())
|
self.root.bind('*', lambda e: self.multiply())
|
||||||
self.root.bind('/', lambda e: self.divide())
|
self.root.bind('/', lambda e: self.divide())
|
||||||
self.root.bind('<Escape>', lambda e: self.clear())
|
|
||||||
|
|
||||||
def digit(self, d):
|
def digit(self, d):
|
||||||
"""Handle digit button press"""
|
"""Handle digit button press"""
|
||||||
|
|
@ -157,12 +128,14 @@ class HPCalculator:
|
||||||
self.entry_buffer = '-' + self.entry_buffer
|
self.entry_buffer = '-' + self.entry_buffer
|
||||||
self.update_entry_display()
|
self.update_entry_display()
|
||||||
|
|
||||||
def enter(self):
|
def enter(self, key=False):
|
||||||
"""Push current entry onto stack"""
|
"""Push current entry onto stack"""
|
||||||
if self.entry_buffer:
|
if self.entry_buffer:
|
||||||
self.execute_code(self.entry_buffer)
|
self.execute_code(self.entry_buffer)
|
||||||
self.entry_buffer = ""
|
self.entry_buffer = ""
|
||||||
self.is_new_entry = True
|
self.is_new_entry = True
|
||||||
|
elif key:
|
||||||
|
self.execute_code("dup")
|
||||||
self.update_displays()
|
self.update_displays()
|
||||||
|
|
||||||
def add(self):
|
def add(self):
|
||||||
|
|
@ -219,21 +192,6 @@ class HPCalculator:
|
||||||
self.execute_code("drop")
|
self.execute_code("drop")
|
||||||
self.update_displays()
|
self.update_displays()
|
||||||
|
|
||||||
def dup(self):
|
|
||||||
"""Duplicate top stack item"""
|
|
||||||
self.enter()
|
|
||||||
self.execute_code("dup")
|
|
||||||
self.update_displays()
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
"""Clear entry and stack"""
|
|
||||||
self.entry_buffer = ""
|
|
||||||
self.is_new_entry = True
|
|
||||||
# Clear the stack
|
|
||||||
while len(self.interp.stack) > 0:
|
|
||||||
self.interp.pop()
|
|
||||||
self.update_displays()
|
|
||||||
|
|
||||||
def execute_code(self, code):
|
def execute_code(self, code):
|
||||||
"""Execute stack language code"""
|
"""Execute stack language code"""
|
||||||
try:
|
try:
|
||||||
|
|
@ -274,7 +232,7 @@ class HPCalculator:
|
||||||
value_str = self.format_stack_entry(entry)
|
value_str = self.format_stack_entry(entry)
|
||||||
self.stack_labels[i].config(text=f"T{level}: {value_str}")
|
self.stack_labels[i].config(text=f"T{level}: {value_str}")
|
||||||
else:
|
else:
|
||||||
self.stack_labels[i].config(text=f"T{level}: 0")
|
self.stack_labels[i].config(text=f"T{level}: <>")
|
||||||
|
|
||||||
def format_stack_entry(self, entry):
|
def format_stack_entry(self, entry):
|
||||||
"""Format a stack entry for display"""
|
"""Format a stack entry for display"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue