- 問題背景
假設我們需要創建一個類似于微軟計算器的 GUI 計算器。這個計算器應該具有以下功能:
- 能夠顯示第一個輸入的數字。
- 當按下運算符時,輸入框仍顯示第一個數字。
- 當按下第二個數字時,第一個數字被替換。
- 解決方案
為了解決這個問題,我們需要使用狀態的概念。每次按下按鍵時,檢查狀態并確定要采取的操作。
- 起始狀態:輸入數字。
- 當按下運算符按鈕時:存儲運算符,改變狀態。
- 當按下另一個數字時:存儲數字,清除數字輸入,重新開始數字輸入。
- 當按下等號按鈕時:使用存儲的數字和運算符以及數字輸入中的當前數字,執行操作。
使用動態語言,例如 Python,可以改變處理按鍵/按鈕按下事件的函數,而不是使用變量和 if 語句來檢查狀態。
import tkinter as tkclass Calculator:def __init__(self):self.window = tk.Tk()self.window.title("Calculator")# 創建顯示屏self.display = tk.Entry(self.window, width=30)self.display.grid(row=0, column=0, columnspan=4)# 創建數字按鈕self.buttons = [["7", "8", "9", "/"],["4", "5", "6", "*"],["1", "2", "3", "-"],["0", ".", "=", "+"]]# 創建運算符按鈕self.operators = ["/", "*", "-", "+"]# 創建狀態變量self.state = "number"# 創建數字列表self.numbers = []# 創建運算符列表self.operators = []# 創建計算結果變量self.result = None# 創建按鈕for row in range(4):for column in range(4):button = tk.Button(self.window, text=self.buttons[row][column], command=lambda row=row, column=column: self.handle_button_press(row, column))button.grid(row=row+1, column=column)def handle_button_press(self, row, column):# 獲取按鈕值button_value = self.buttons[row][column]# 檢查按鈕值是否是數字if button_value in "0123456789.":# 如果是數字,則將數字添加到數字列表self.numbers.append(button_value)# 更新顯示屏self.display.delete(0, tk.END)self.display.insert(0, "".join(self.numbers))# 檢查按鈕值是否是運算符elif button_value in self.operators:# 如果是運算符,則將運算符添加到運算符列表self.operators.append(button_value)# 改變狀態self.state = "operator"# 更新顯示屏self.display.delete(0, tk.END)self.display.insert(0, "".join(self.operators))# 檢查按鈕值是否是等號elif button_value == "=":# 如果是等號,則執行計算self.result = eval("".join(self.numbers) + self.operators[0] + "".join(self.numbers))# 更新顯示屏self.display.delete(0, tk.END)self.display.insert(0, self.result)# 重置狀態self.state = "number"# 清空數字列表和運算符列表self.numbers = []self.operators = []def run(self):self.window.mainloop()if __name__ == "__main__":calculator = Calculator()calculator.run()