使用tkinter时出现TypeError: object of type 'Tk' has no len()报错如何解决
报错根本原因
你遇到的TypeError: object of type 'Tk' has no len()报错完全来自pack方法的错误调用:
tkinter组件的pack()是布局方法,不需要额外传入父容器作为参数——你在创建组件(比如myPad= Label(root, text = Greeting))时已经指定了父容器root,pack方法会自动绑定到对应父容器布局。
你写的myPad.pack(root)是把Tk类型的root对象传给了pack方法的第一个cnf配置参数,该参数内部需要处理可迭代的配置项、会调用len()校验长度,而Tk对象没有实现__len__方法,直接触发类型报错。
其他存在的代码问题
除了pack调用错误外,你的代码还有多个影响运行的逻辑问题:
- 条件判断逻辑错误:
if varrr == "Yes" or "yes"的写法永远返回True,正确写法为if varrr.lower() == "yes" - Label参数缺失:创建
labelthree、labelfour时未指定text关键字参数,直接传字符串会触发参数不匹配报错 - 输入获取逻辑错误:Entry创建后立刻调用
get(),此时窗口刚完成渲染、用户还没有完成输入,永远只能拿到空字符串 - 无效嵌套循环:外层
while True和tkinter的root.mainloop()事件循环冲突,会导致窗口重复创建、程序卡死 - 组件布局错误:创建
e2输入框后,错误调用了e.pack()而非e2.pack(),会导致e2无法显示 - 样式参数不合理:Entry的borderwidth设为70、50会让输入框高度超出常规显示范围
修复后可运行代码
import random from tkinter import * # 初始化主窗口 root = Tk() # 全局变量定义 Greeting ="Dydh da !" choicelist = "language practise(A), positive message (B) or a idea for thought (C)" thing = ["You are doing well", "You look cute", "Keep smiling"] # 输入校验函数 def check_input(): varrr = e.get() if varrr.lower() == "yes": labelthree = Label(root, text="choose a task") labelfour = Label(root, text="language, happy message and ideas for thoughts") labelthree.pack(pady=5) labelfour.pack(pady=5) e2 = Entry(root,borderwidth =5) e2.pack(pady=5) else: labelstop =Label(root, text= "No problem") labelstop.pack(pady=5) # 初始组件创建 myPad= Label(root, text = Greeting) myPad2 = Label(root, text ="please type Yes to start") # 修复pack调用,去掉root参数,可按需加边距 myPad.pack(pady=10) myPad2.pack(pady=5) e = Entry(root, borderwidth=5) e.pack(pady=5) # 新增按钮触发输入校验 submit_btn = Button(root, text="提交", command=check_input) submit_btn.pack(pady=10) root.mainloop()
核心修改说明
- 所有
pack()调用去掉传入的root参数,直接调用无参pack()即可,可传入pady/padx/side等参数调整布局效果 - 新增提交按钮绑定输入校验逻辑,确保用户输入完成后再获取内容
- 修复条件判断、Label参数、布局调用等逻辑错误
- 移除外层无效的
while True循环,避免程序卡死 - 调整borderwidth为合理数值,保证界面显示正常
内容的提问来源于stack exchange,提问作者ZzZz
相关产品推荐
相关产品推荐

