1 设计思路
制作一个计算器需要考虑以下问题:
1、定义功能:确定计算器需要实现哪些功能,比如基本的加减乘除,或者更复杂的科学计算功能。
2、设计用户界面:设计图形用户界面(GUI)来与用户交互。
3、实现基本逻辑:编写代码来处理用户输入,执行计算,并输出结果。
4、测试与调试:确保每个功能都按预期工作,并处理可能的异常情况。
5、优化与扩展:根据需要添加更多功能,优化用户体验。
2 编写程序
示例代码:
import tkinter as tkclass CalculatorApp(): # 初始化 def __init__(self): self.init_vars() self.init_ui() # 初始化参数 def init_vars(self): self.lists = [] # 记录整段输入内容,用于最后计算结果 self.is_press_sign = False # 记录运算符是否按下 self.is_press_point = False # 记录小数点是否按下 # 创建UI界面 def init_ui(self): # 显示面板 self.root = tk.Tk() self.root.minsize(280, 395) # 界面尺寸 self.root.title('计算器') # 文本框 self.history_info = tk.StringVar(value='') # 显示历史计算过程 self.current_info = tk.StringVar(value='0') # 显示当前结果 label = tk.Label(self.root, font=('微软雅黑', 16), bg='#EEE9E9', fg='gray', anchor='se', textvariable=self.history_info) label.place(width=280, height=60) label2 = tk.Label(self.root, font=('微软雅黑', 20), bg='#EEE9E9', fg='black', anchor='se', textvariable=self.current_info) label2.place(y=60, width=280, height=60) # 数字键按键 self.create_number_buttons() # 运算符号按键 self.create_operator_buttons() # tk事件循环 self.root.mainloop() # 创建数字按键 def create_number_buttons(self): buttons = [ # (键值, x坐标, y坐标) ('7', 0, 175), ('8', 70, 175), ('9', 140, 175), ('4', 0, 230), ('5', 70, 230), ('6', 140, 230), ('1', 0, 285), ('2', 70, 285), ('3', 140, 285), ('0', 70, 340), ] for text, x, y in buttons: btn = tk.Button(self.root, text=text, font=('微软雅黑', 16), fg='black', bd=0.5, command=lambda t=text: self.press_num(t)) btn.place(x=x, y=y, width=70, height=55) # 创建符号按键 def create_operator_buttons(self): buttons = [ # (键值, x坐标, y坐标, 颜色, 回调) ('C', 0, 120, 'orange', lambda: self.press_compute('C')), ('←', 105, 120, 'black', lambda: self.press_compute('←')), ('÷', 210, 120, 'black', lambda: self.press_compute('/')), ('x', 210, 175, 'black', lambda: self.press_compute('*')), ('-', 210, 230, 'black', lambda: self.press_compute('-')), ('+', 210, 285, 'black', lambda: self.press_compute('+')), ('=', 210, 340, 'orange', lambda: self.press_compute('=')), ('%', 0, 340, 'black', lambda: self.press_compute('%')), ('.', 140, 340, 'black', lambda: self.press_compute('.')), ] for text, x, y, fg, command in buttons: btn = tk.Button(self.root, text=text, font=('微软雅黑', 16), fg=fg, bd=0.5, command=command) if text == 'C' or text == '←': # 'C'和'←'键布局特殊处理 btn.place(x=x, y=y, width=105, height=55) else: btn.place(x=x, y=y, width=70, height=55) # 数字键回调函数 def press_num(self, num): if self.is_press_sign: # 如果前一个按键按下的是运算符,前面输入的数字清0 self.current_info.set('0') self.is_press_sign = False self.is_press_point = False old_num = self.current_info.get() # 获取前面已输入的数字 if old_num == '0': self.current_info.set(num) else: new_num = old_num + num self.current_info.set(new_num) # 符号按键回调 def press_compute(self, sign): num = self.current_info.get() # 获取当前输入值 if sign == 'C': # 清除数据 if not num == '0': self.current_info.set('0') else: self.lists.clear() self.history_info.set('') elif sign == '←': # 退格 new_num = 0 # 新值 if num[-1] == '.': # 前面有小数点,退格2位 new_num = num[0:-2] self.is_press_point = False else: # 前面有无数点,退格1位 new_num = num[0:-1] if not new_num: # 新值为空,重设0 new_num = '0' self.current_info.set(new_num) elif sign == '.': # 小数点处理 if self.is_press_point == False: self.current_info.set(num + '.') self.is_press_point = True elif sign == '=': if self.is_press_sign == False: # 添加当前输入值并计算最终结果 self.lists.append(num) else: # 删除上一个输入的运算符 self.lists.pop() compute_str = ''.join(self.lists) end_num = eval(compute_str) # 使用eval()函数来计算最终运算的结果 end_num = round(end_num, 8) # 保留8位小数,若去掉,某些小数计算就可能会出现一点点偏差(比如3.14+1) self.current_info.set(end_num) self.history_info.set(compute_str + '=') self.lists.clear() self.is_press_point = False self.is_press_sign = False else: # 运算符(+-*/%) if self.is_press_sign == False: self.is_press_sign = True self.lists.append(num) self.lists.append(sign) # 显示已输入内容 compute_str = ''.join(self.lists) self.history_info.set(compute_str) self.is_press_point = False else: # 覆盖上一个输入的运算符 self.lists.pop() self.lists.append(sign) # 显示已输入内容 compute_str = ''.join(self.lists) self.history_info.set(compute_str)if __name__ == "__main__": CalculatorApp()
上述代码使用了tkinter库来创建图形用户界面。这个程序能够处理基本的算术运算,包括加、减、乘、除、百分比计算,以及处理小数点、清除(C)和退格(←)功能。
3 运行测试
运行结果如下:
注:目前测试暂未发现bug,但需要注意的是,这个程序最终是使用了eval()函数来计算表达式,这个函数可能会存在某些bug,比如:使用eval()函数计算字符串’3.14+1’,得到的结果是4.140000000000001,这个可能跟浮点数内存的存储方式和精度有关,但是对一个简易的计算器来说大体上是不影响的。
阅读全文
452