Tkinter开发出现AttributeError和TclError两类报错如何解决
报错原因与解决方案
第一个报错:AttributeError: 'NoneType' object has no attribute 'place_forget'
触发原因有三个:
- 取值逻辑错误:
dmButtonVariable是Tkinter的IntVar类型实例,必须调用.get()方法才能获取存储的实际数值,直接写if dmButtonVariable == True是将实例对象本身和布尔值比较,永远返回False,每次触发回调都会走else分支调用place_forget() - 变量值无更新逻辑:普通Button不会自动修改关联变量的值,你没有写任何修改
dmButtonVariable的代码,就算判断逻辑正确,点击按钮也不会切换状态 - 常见触发场景:如果创建
dmframe时使用了dmframe = Frame(父容器).place(...)的链式写法,place()方法返回值为None,会导致dmframe本身被赋值为None,调用任何方法都会触发该报错
第二个报错:_tkinter.TclError: unknown option "-variable"
触发原因:Tkinter普通Button组件不支持variable配置参数,该参数仅可用于Checkbutton、Radiobutton、Entry这类自带变量绑定能力的组件,给普通Button新增该参数属于非法配置,会直接抛出Tcl错误。
修复方案
你要实现点击按钮切换dmframe显示/隐藏的需求,不需要给普通Button绑定variable,直接在回调函数里手动切换变量值即可,修复后的参考代码如下:
dmButtonVariable = IntVar() dmButtonVariable.set(True) # 注意创建dmframe不要链式调用place,正确写法如下: # dmframe = Frame(你的父容器) def goDm(): # 手动切换变量值 current_state = dmButtonVariable.get() dmButtonVariable.set(not current_state) if dmButtonVariable.get() == 1: # IntVar存储的布尔值对应1/0 dmframe.place(x=0,y=0) else: dmframe.place_forget() dm_icon = PhotoImage(file="send.png") dm_icon_button=Button(frame2, image = dm_icon, command=goDm) dm_icon_button.place(x=365, y=5)
内容的提问来源于stack exchange,提问作者Yiğit Yılmaz
相关产品推荐
相关产品推荐

