You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)写在了按钮创建的循环内部,导致循环每生成一个按钮就绑定一次键盘事件,多次绑定后触发事件时引发异常。同时代码还有其他功能缺陷:

  1. 按钮列表重复添加了*,缺少清除按钮C;
  2. button_click方法中写了C按钮的逻辑,但没有对应按钮;
  3. 异常捕获不完整,未处理除以零的情况。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:22:21