Tkinter提交按钮触发"frame object is not callable"报错求解
错误核心原因
frame object is not callable是典型的命名覆盖问题:
- 你先定义了用于计算年龄的函数
age() - 后续创建出生日期输入区的Frame容器时,直接将容器赋值给了变量
age,原本的函数被Frame对象完全覆盖 - 提交按钮的lambda回调执行
age()时,解释器找到的是那个Frame容器对象,Frame本身不能像函数一样被调用,直接触发报错。
其他附带bug
除了核心命名冲突,代码还有3处会导致运行异常的问题:
- 年龄计算逻辑中引用的输入框变量名和实际定义不匹配:代码写的是
birth_day.get()/birth_month.get()/birth_year.get(),但实际创建的出生日期输入框绑定的变量是yearvalue/monthvalue/dayvalue,就算解决命名冲突也会触发变量不存在错误 - 年龄计算完成后没有将结果插入到对应的年龄列表框
d中,计算结果不会显示 - 出生日期输入没有做合法性校验,用户输入非数字内容时程序会直接崩溃
修复步骤
- 重命名出生日期输入区的Frame变量,避免和年龄计算函数重名:
将原代码中age = Frame(fr)修改为age_input_frame = Frame(fr),后续所有引用该Frame的位置(包含内部子容器xo、三个出生日期输入框的父容器参数)同步替换为age_input_frame - 重写年龄计算函数,修正变量引用、增加结果插入逻辑和异常校验:
def age(): try: d_val = int(dayvalue.get()) m_val = int(monthvalue.get()) y_val = int(yearvalue.get()) user_age = today.year - y_val - ((today.month, today.day) < (m_val, d_val)) d.insert(END, user_age) except ValueError: messagebox.showerror("输入错误", "请输入合法的数字格式出生日期") - (可选)优化提交逻辑,避免用户空输入时提交无效内容:可以在三个回调函数最开始增加姓名、出生日期非空判断,空内容时弹出提示直接返回。
修复后规范的组件定义写法
drop = OptionMenu(fr, clicked, *two ) drop.pack(pady=10) add = Button(fr, text="submit", command=lambda:[adi(), gen(), age()]) add.pack()
注:组件定义和pack()最好分开写,避免变量拿到None值,虽然当前代码没有用到这些组件变量不会触发错误,但属于Tkinter编写的通用规范
内容的提问来源于stack exchange,提问作者Wash-Basin
相关产品推荐
相关产品推荐

