Tkinter中grid调用位置差异导致pack布局报错的原因咨询
问题核心原因
两段代码的本质差异是grid()方法的返回值,以及子组件的父容器归属:
- Tkinter所有布局方法(
pack()/grid()/place())的返回值都是None
第一段代码里,你直接写fr1 = tk.Frame(fen).grid(row=0,column=0),相当于先创建了Frame对象,立刻调用它的grid方法布局,最后把grid方法的返回值None赋值给了fr1变量,同理fr2也是None。
当你后续创建Label等子组件时,写tk.Label(fr1, text="txt1"),传入的父容器参数是None,Tkinter会默认把根窗口fen作为这些子组件的父容器。此时根窗口fen里已经有两个Frame是用grid布局的,你又试图给根窗口的新子组件用pack布局,Tkinter不允许同一个父容器混用两种不同的布局管理器,就抛出了你看到的错误。
第二段代码的逻辑是对的:先把创建好的Frame实例赋值给fr1、fr2变量,再把所有子组件放到这两个Frame内部用pack布局(不同父容器的布局管理器互不干扰),最后再调用fr1.grid()、fr2.grid()把两个Frame放到根窗口里,不会产生布局冲突,所以可以正常运行。
小提示:Tkinter开发中要永远把组件实例创建和布局调用分成两行写,永远不要把布局方法的返回值赋值给组件变量,避免出现这类隐性错误。
内容的提问来源于stack exchange,提问作者Hugo Chevroton
相关产品推荐
相关产品推荐

