Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tkinter:pack()正在打包使用grid()的帧_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x Tkinter:pack()正在打包使用grid()的帧

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稍后包含许多数据选择下

我正在为数据显示小程序开发UI。我从一个教程开始,后来将它扩展到了教程的范围之外,但是教程中的一些遗留部分现在给我带来了困难。特别是关于
pack()
grid()

在本教程之后,我定义了一个
类窗口(框架)
对象,然后将其声明为
app=Window(root)
where
root=Tk()
。在
窗口中
对象是一个初始化函数
def init_Window(self)
,我的问题就出现在这里。以下是
init\u window()
中的相关代码:

其中,object
self.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
,除了一小部分布局问题。