- 问题背景
假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能:
- 能够显示第一个输入的数字。
- 当按下运算符时,输入框仍显示第一个数字。
- 当按下第二个数字时,第一个数字被替换。
- 解决方案
为了解决这个问题,我们需要使用状态的概念。每次按下按键时,检查状态并确定要采取的操作。
- 起始状态:输入数字。
- 当按下运算符按钮时:存储运算符,改变状态。
- 当按下另一个数字时:存储数字,清除数字输入,重新开始数字输入。
- 当按下等号按钮时:使用存储的数字和运算符以及数字输入中的当前数字,执行操作。
使用动态语言,例如 Python,可以改变处理按键/按钮按下事件的函数,而不是使用变量和 if 语句来检查状态。
代码语言:javascript
复制
import tkinter as tk
class 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()