Updated sls_calc module

This commit is contained in:
Kyler Olsen 2025-12-04 23:52:42 -07:00
parent d7164599f0
commit 8890216457
1 changed files with 24 additions and 66 deletions

View File

@ -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), ('', self.square), ('1/x', self.reciprocal), ('NULL', lambda: None)],
[('', self.sqrt), ('', 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"""