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中。
问题根源
- 变量名冲突:初始化时
self.przy被赋值为字符串"p1",在przycisk()方法中又将其重新赋值为Button对象。但在设置command时,self.przy还是字符串类型,因此调用self.przy.liczba1会触发"字符串无此属性"的错误。 - 列表操作语法错误:
l1.insert[int(self.text)]写法错误,insert是列表方法,需要用括号传递参数(索引+元素),如果只是在列表末尾添加元素,用append()更直接。 - 无效全局声明:
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
相关产品推荐
相关产品推荐

