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

Python Tkinter按钮调用类内函数的计算器问题排查

Tkinter计算器按钮调用类函数报错解决

问题描述

我正在用Python开发一款简易计算器,希望实现点击按钮调用类中的函数。以下是我的代码:

from tkinter import*

l1 = []
l2 = []

root = Tk()

class przycisk:
    global liczba1
    def __init__(self, przy , text, row, column):
        self.przy = przy
        self.text = text
        self.row = row
        self.column = column

    def przycisk(self):
        self.przy = Button(root, text=f"{self.text}",
                           command=self.przy.liczba1)
        self.przy.grid(row = self.row, column = self.column, padx=2, pady=2)

    
    def liczba1(self):
        if bool(l1) == False:
            l1.insert[int(self.text)]


p1 = przycisk("p1" ,text = 1,row = 0,column = 0)
p1.przycisk()

运行后弹出错误:

command=self.przy.liczba1)
            ^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'liczba1'

预期效果:点击按钮后将数字1插入列表l1中。


问题根源

  1. 变量名冲突:初始化时self.przy被赋值为字符串"p1",在przycisk()方法中又将其重新赋值为Button对象。但在设置command时,self.przy还是字符串类型,因此调用self.przy.liczba1会触发"字符串无此属性"的错误。
  2. 列表操作语法错误:l1.insert[int(self.text)]写法错误,insert是列表方法,需要用括号传递参数(索引+元素),如果只是在列表末尾添加元素,用append()更直接。
  3. 无效全局声明:global liczba1完全多余,liczba1是类的方法,不属于全局变量范畴。

修改后的完整代码

from tkinter import*

l1 = []
l2 = []

root = Tk()

class przycisk:
    def __init__(self, text, row, column):
        self.text = text
        self.row = row
        self.column = column
        # 初始化时直接创建按钮,简化调用流程
        self.create_button()

    def create_button(self):
        # 用更清晰的变量名存储按钮,避免冲突
        self.button = Button(root, text=f"{self.text}",
                           command=self.liczba1)
        self.button.grid(row=self.row, column=self.column, padx=2, pady=2)

    def liczba1(self):
        # 简化空列表判断逻辑
        if not l1:
            # 向空列表添加元素,若需插入指定位置,可改用l1.insert(0, self.text)
            l1.append(self.text)
        # 打印验证结果,方便调试
        print(f"当前列表l1内容: {l1}")


p1 = przycisk(text=1, row=0, column=0)
# 必须添加主循环,否则窗口无法正常显示并运行
root.mainloop()

核心修改说明

  • 移除了初始化时无用的przy参数,彻底避免变量名冲突问题
  • 按钮的command直接绑定类的实例方法self.liczba1,无需间接调用
  • 修正列表操作的语法错误,用append()实现添加元素的需求
  • 添加root.mainloop(),保证Tkinter窗口能正常启动并响应事件
  • 简化空列表判断逻辑,提升代码可读性

内容的提问来源于stack exchange,提问作者Hougu niania

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:25:29