From a96c3124076d13d3648dceb362d43b7e902ee7e5 Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Fri, 23 Jun 2023 23:16:44 -0700 Subject: [PATCH] calculator style input --- __main__.py | 73 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/__main__.py b/__main__.py index df6dd4a..3841e01 100644 --- a/__main__.py +++ b/__main__.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3.11 from customtkinter import set_appearance_mode, set_default_color_theme -from customtkinter import CTk, CTkEntry, CTkButton, CTkLabel, CTkFrame, CTkSwitch +from customtkinter import CTk, CTkEntry, CTkButton, CTkLabel, CTkFrame, CTkSwitch, StringVar from currencyButtons import initializeCurrencyButtons class Window(CTk): @@ -25,26 +25,49 @@ class Window(CTk): # Static label mainLabel: CTkLabel = CTkLabel(master=self.left_frame, text="Change Due Calculator", font=("Arial", 18, 'bold')) - mainLabel.grid(row=0, column=0, pady=12, padx=10) + mainLabel.grid(row=0, column=0, pady=12) - charValidation = self.register(self.only_numbers) - self.entry: CTkEntry = CTkEntry( - master=self.left_frame, - width=200, - height=40, - validate="key", - validatecommand=(charValidation, '%d', '%s', '%S'), - placeholder_text="Amount Charged..." + calculateFrame: CTkFrame = CTkFrame(master=self.left_frame, width=((self.width / 2 - 20) / 2), height=(self.height / 2 - 110), fg_color="gray15") + calculateFrame.grid_propagate(False) + calculateFrame.grid(pady=(0, 12), padx=15) + + self.amount = StringVar() + self.amountBox: CTkEntry = CTkEntry( + master=calculateFrame, + width=(((self.width / 2 - 20) / 2) - 24), + height=50, + textvariable=self.amount ) - self.entry.grid(row=1, column=0, pady=12, padx=10) - self.entry.insert(0, 'Amount Charged...') + self.amountBox.grid(row=0, column=0, pady=12, padx=10) + + calculateButtonFrame: CTkFrame = CTkFrame(master=calculateFrame, width=(((self.width / 2 - 20) / 2) - 24), height=(self.height / 2 - 196), fg_color="gray15") + calculateButtonFrame.grid_propagate(False) + calculateButtonFrame.grid(row=1, column=0, pady=(0, 12), padx=10) + + buttons: list[CTkButton] = [CTkButton( + master=calculateButtonFrame, + text=f'{i}', + command=lambda: self.amountSum(f'{i}'), + width=(((self.width / 2 - 20) / 2) - 48) / 3, + height=(self.height / 2 - 196) / 4 - 12, + ) for i in range(0, 10)] + + buttons[0].grid(row=3, column=1, padx=(0, 12), pady=(12, 0)) + i = 1 + for r in range(3): + for c in range(3): + buttons[i].grid(row=r, column=c, padx=(0, 12), pady=(12, 0)) + i += 1 # Warning Label self.invalidLabel: CTkLabel = CTkLabel(master=self.left_frame, text="Not a Number!", text_color="red", font=("Arial", 20, 'bold')) calculateButton: CTkButton = CTkButton(master=self.left_frame, text="Calculate", command=self.calculate, width=200, height=50) - calculateButton.grid(row=2, column=0, pady=12, padx=10) + calculateButton.grid(row=1, column=2, pady=12, padx=10) + clearButton: CTkButton = CTkButton(master=self.left_frame, text="Clear", command=self.clear, width=200, height=50) + clearButton.grid(row=1, column=3, pady=12, padx=10) + self.left_frame_bottom: CTkFrame = CTkFrame(master=self, width=(self.width / 2 - 20), height=(self.height / 2 - 40), fg_color="gray20") self.left_frame_bottom.grid_propagate(False) self.left_frame_bottom.grid(row=0, column=0, pady=20, padx=10, sticky='SW') @@ -83,24 +106,6 @@ class Window(CTk): def quitApplication(self, event=None) -> None: self.destroy() - def only_numbers(self, action: str, current: str, char: str) -> bool: - if int(action) == 0: return True # If delete character - if '.' in current and len(current.split('.')[1]) == 2: return False # prevent more than 2 decimal - return (char.isdigit() or char == ".") # only allow digits and decimal - - def _validateInput(func: callable) -> callable: - def wrapper(self): - self.invalidLabel.pack_forget() - try: - self.amountDue = float(self.entry.get()) - except ValueError: - self.invalidLabel.grid(row=3, column=0) - return - func(self) - - return wrapper - - @_validateInput def calculate(self) -> None: print(self.amountDue) @@ -110,5 +115,11 @@ class Window(CTk): if self.total < 0: self.total = 0 self.totalLabel.configure(text=f"Total: {self.total:.2f}") + def amountSum(self, value: str) -> None: + pass + + def clear(self) -> None: + pass + if __name__ == '__main__': window = Window()