Python 3.x Tkinter:pack()正在打包使用grid()的帧
我正在为数据显示小程序开发UI。我从一个教程开始,后来将它扩展到了教程的范围之外,但是教程中的一些遗留部分现在给我带来了困难。特别是关于Python 3.x Tkinter:pack()正在打包使用grid()的帧,python-3.x,tkinter,Python 3.x,Tkinter,我正在为数据显示小程序开发UI。我从一个教程开始,后来将它扩展到了教程的范围之外,但是教程中的一些遗留部分现在给我带来了困难。特别是关于pack()和grid() 在本教程之后,我定义了一个类窗口(框架)对象,然后将其声明为app=Window(root)whereroot=Tk()。在窗口中对象是一个初始化函数def init_Window(self),我的问题就出现在这里。以下是init\u window()中的相关代码: 其中,objectself.mainframe稍后包含许多数据选择下
pack()
和grid()
在本教程之后,我定义了一个类窗口(框架)
对象,然后将其声明为app=Window(root)
whereroot=Tk()
。在窗口中
对象是一个初始化函数def init_Window(self)
,我的问题就出现在这里。以下是init\u window()
中的相关代码:
其中,objectself.mainframe
稍后包含许多数据选择下拉列表和按钮
如果我理解这段代码的作用:它将整个窗口设置为带有各种帧的pack()
ed。然后它初始化一个框架,self.mainframe
,并在该框架内初始化一个grid()
。因此,pack()
和grid()
不会发生冲突。此设置是按照上述教程构建的
这在我正在开发小程序的计算机上正常工作。但是,当协作者编译时,他们会收到
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack
在线self.mainframe.grid(…)
。我已经用mainframe.place()
命令替换了mainframe.pack()
命令,但这并没有解决问题(因为他的编译没有达到那个点);我还没有找到一种方法来删除self.pack()
命令,而不导致UI的所有其他元素消失
有人能帮助我们了解出了什么问题吗?作为参考,我们都在使用MacOS,并使用Python3进行编译。我可以根据要求在一定范围内提供附加信息。错误会准确地告诉您出了什么问题。如果已使用
pack
管理根窗口中的小部件,则无法在根窗口中的小部件上使用grid
你写道:
然后它初始化一个框架self.mainframe,并在该框架内初始化一个grid()
不,这不是您的代码所做的。它不是在框架内设置网格,而是尝试使用grid
将小部件添加到根窗口
首先,您有一行代码,它在根窗口中的小部件上使用pack
:
self.pack(fill=BOTH,expand=1)
self.mainframe = Frame(root)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
稍后,您将尝试对根窗口中的另一个窗口使用grid
:
self.pack(fill=BOTH,expand=1)
self.mainframe = Frame(root)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
上面的代码不是在self.mainframe
中设置网格,而是使用grid
将小部件添加到根窗口
您需要使用一个或另一个,不能对同时是根窗口的直接子窗口的不同窗口同时使用这两个
换句话说,您正在这样做:
self.pack(fill=BOTH,expand=1)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
但是由于self
和self.mainframe
都是根窗口的直接子窗口,所以不能这样做。您需要使用pack
进行以下两种操作:
self.pack(fill=BOTH,expand=1)
self.mainframe.pack(...)
self.grid(...)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
。。。或grid
用于以下两种情况:
self.pack(fill=BOTH,expand=1)
self.mainframe.pack(...)
self.grid(...)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
很有趣,谢谢你的回复。然而,我不认为我完全清楚这两者之间的区别。你是说我无法将窗口细分为多个区域,将这些区域打包在一起,并使用网格在区域内放置项目?或者你是说这是可能的,但这不是我的代码设置的目的?(如果是后者,你能建议如何修复吗?@Izzy“你是说我不能将窗口细分为多个区域,将这些区域打包在一起,并使用网格在区域内放置项目?”不,我绝对不是这么说。我想说的是,您不能使用
pack
将一个小部件添加到root,也不能使用grid
将另一个小部件添加到root。“或者您是说这是可能的,但这不是我的代码设置的目的?”-正确。这是可能的,但这不是你的代码所做的。我非常感谢你的帮助,我愿意接受你的回答。然而,我仍然不清楚如何实现满足我需求的解决方案:即在我的窗口中有一个(子)网格,而不强制执行全局网格布局。我的大多数小部件都使用place()
方法,但只有这一小部分使用了grid()
。按照建议,简单地将self.place()
行替换为self.grid()
(带有适当的参数),失败了:结果窗口中只有大型机可见。我也不清楚为什么这个程序像为我编写的那样工作,但对其他人来说却失败了。@Izzy:你可以在大型机的内部使用网格
。您的问题是在根目录中同时使用了pack
和grid
。如果您使用的是place
,则由您来确保容器足够大,可以容纳孩子。与grid
和pack
不同,使用place
不会调整容器大小以适合其子容器。这就是为什么我建议不要使用place
,除了一小部分布局问题。