Python属性创建与初始化方法及计算器‘无key属性’报错修复
Python类属性创建与初始化 & Tkinter计算器报错修复
一、Python中创建并初始化类属性
- 实例属性(每个实例独立拥有):在类的
__init__方法中,通过self.属性名 = 初始值定义,比如示例里的self.master = master、self.display = tk.Entry(...),后续可在类的任意方法中通过self.属性名访问修改。 - 类属性(所有实例共享):直接在类内部、所有方法外部定义,比如
class Calculator: total_instances = 0,访问时用Calculator.total_instances或实例对象调用self.total_instances。
二、Tkinter计算器报错分析与修复
核心问题排查
你遇到的“Calculator类没有'key'属性”报错,根源是键盘事件重复绑定:self.master.bind('<Key>', self.key_press)写在了按钮创建的循环内部,导致循环每生成一个按钮就绑定一次键盘事件,多次绑定后触发事件时引发异常。同时代码还有其他功能缺陷:
- 按钮列表重复添加了
*,缺少清除按钮C; button_click方法中写了C按钮的逻辑,但没有对应按钮;- 异常捕获不完整,未处理除以零的情况。
修正后的完整代码
import tkinter as tk class Calculator: def __init__(self, master): self.master = master master.title("Calculator") # 初始化显示框实例属性 self.display = tk.Entry(master, width=35, borderwidth=5, font=('Arial', 16)) self.display.grid(row=0, column=0, columnspan=4, padx=10, pady=10) # 修正按钮列表:添加清除按钮C,移除重复的* button_list = [ '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', 'C', '0', '.', '=' ] row = 1 col = 0 for button_text in button_list: button = tk.Button(master, text=button_text, width=5, height=2, font=('Arial', 14), command=lambda x=button_text: self.button_click(x)) button.grid(row=row, column=col, padx=5, pady=5) if col == 3: col = 0 row += 1 else: col += 1 # 键盘事件绑定移到循环外部,仅执行一次 self.master.bind('<Key>', self.key_press) def button_click(self, button): current = self.display.get() if button == 'C': self.display.delete(0, tk.END) elif button == '=': try: result = eval(current) self.display.delete(0, tk.END) self.display.insert(0, str(result)) except (SyntaxError, ZeroDivisionError): self.display.delete(0, tk.END) self.display.insert(0, "Error") else: self.display.delete(0, tk.END) self.display.insert(0, current + button) def key_press(self, event): key = event.char if key in '0123456789+-*/.': self.button_click(key) elif key == '\r': # 回车键触发等于计算 self.button_click('=') elif key == '\x1b': # ESC键触发清除 self.display.delete(0, tk.END) root = tk.Tk() calculator = Calculator(root) root.mainloop()
关键修复点
- 将键盘事件绑定代码移到按钮循环外,避免重复绑定引发冲突;
- 补充清除按钮
C,让功能逻辑对应; - 扩展异常捕获范围,处理除以零的报错场景;
- 保持键盘操作与按钮操作的功能一致性。
内容的提问来源于stack exchange,提问作者DerpOKat21
相关产品推荐
相关产品推荐

