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

Tkinter中'Button对象不可调用'错误的解决求助

问题解决:Tkinter计算器按钮点击报错及输入问题

错误原因

  1. 变量名冲突:你定义了名为button_click的处理函数,但后续又用同一个名字创建了加号按钮,导致原函数被Button对象覆盖,点击数字按钮时会尝试调用Button对象,触发TypeError: 'Button' object is not callable错误。
  2. 输入逻辑缺陷:当前button_click函数每次点击数字都会清空输入框再插入新内容,无法实现连续输入数字的功能。
  3. 按钮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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:01:25