Tkinter中'Button对象不可调用'错误的解决求助
问题解决:Tkinter计算器按钮点击报错及输入问题
错误原因
- 变量名冲突:你定义了名为
button_click的处理函数,但后续又用同一个名字创建了加号按钮,导致原函数被Button对象覆盖,点击数字按钮时会尝试调用Button对象,触发TypeError: 'Button' object is not callable错误。 - 输入逻辑缺陷:当前
button_click函数每次点击数字都会清空输入框再插入新内容,无法实现连续输入数字的功能。 - 按钮command绑定错误:加号、等于、清除按钮绑定的
button_click()没有传递参数,且原函数已被覆盖,无法正常工作。
修正后的代码
from tkinter import * root = Tk() root.title("Simple Calculator") e = Entry(root, width=35, borderwidth=5) e.grid(row=0, column=0, columnspan=3, padx=10, pady=10 ) def button_click(number): # 获取当前输入框内容,追加新数字,而非清空后插入 current = e.get() e.delete(0, END) e.insert(0, str(current) + str(number)) def button_clear(): # 清空输入框 e.delete(0, END) # 临时存储第一个数字,用于后续加法计算 first_number = None def button_add(): global first_number first_number = int(e.get()) e.delete(0, END) def button_equal(): global first_number second_number = int(e.get()) e.delete(0, END) e.insert(0, first_number + second_number) # 定义按钮,修改加号按钮名称避免冲突 button_1 = Button(root, text="1", padx=40,pady=20, command=lambda: button_click(1)) button_2 = Button(root, text="2", padx=40,pady=20, command=lambda: button_click(2)) button_3 = Button(root, text="3", padx=40,pady=20, command=lambda: button_click(3)) button_4 = Button(root, text="4", padx=40,pady=20, command=lambda: button_click(4)) button_5 = Button(root, text="5", padx=40,pady=20, command=lambda: button_click(5)) button_6 = Button(root, text="6", padx=40,pady=20, command=lambda: button_click(6)) button_7 = Button(root, text="7", padx=40,pady=20, command=lambda: button_click(7)) button_8 = Button(root, text="8", padx=40,pady=20, command=lambda: button_click(8)) button_9 = Button(root, text="9", padx=40,pady=20, command=lambda: button_click(9)) button_0 = Button(root, text="0", padx=40,pady=20, command=lambda: button_click(0)) # 改名button_add,避免覆盖函数 button_add = Button(root, text="+", padx=40,pady=20, command=button_add) button_equals = Button(root, text="=", padx=120,pady=20, command=button_equal) button_clear = Button(root, text="Clear", padx=30,pady=20, command=button_clear) # 放置按钮 button_1.grid(row=3, column=0) button_2.grid(row=3, column=1) button_3.grid(row=3, column=2) button_4.grid(row=2, column=0) button_5.grid(row=2, column=1) button_6.grid(row=2, column=2) button_7.grid(row=1, column=0) button_8.grid(row=1, column=1) button_9.grid(row=1, column=2) button_0.grid(row=4, column=0) button_add.grid(row=4, column=1) button_equals.grid(row=6, column=0, columnspan=3) button_clear.grid(row=4, column=2) root.mainloop()
关键修改点
- 将加号按钮的变量名从
button_click改为button_add,解决函数被覆盖的问题。 - 修改
button_click函数逻辑,先获取当前输入框内容,追加新数字,实现连续输入。 - 为清除、加号、等于按钮分别定义对应的处理函数,绑定正确的command。
内容的提问来源于stack exchange,提问作者Sam Wittwicky
相关产品推荐
相关产品推荐

