Python tkinter:如何在对象上应用 Pack()

Python tkinter: how to apply Pack() on object

所以,我第一次尝试使用 tkinter 在 python 上制作 GUI,但我在 Pack() 属性方面遇到了问题。

到目前为止,我的 GUI 代码如下:

mainframe = tk.Tk()
mainframe.title("Hostname2IP")
mainframe.columnconfigure(1, weight=1)
mainframe.rowconfigure(1, weight=1)

SC= tk.scrolledtext.ScrolledText #shorten code a bit...
SC(master=mainframe, wrap=tk.WORD, width=5, height=15).grid(column=1, row=1, sticky=("NSEW"))
SC(master=mainframe, wrap=tk.WORD, width=5, height=15).grid(column=2, row=1, sticky=("NSEW"))
SC(master=mainframe, wrap=tk.WORD, width=5, height=15).grid(column=3, row=1, sticky=("NSEW"))

L1 = tk.Label(master=mainframe, text="Label1").grid(column=1, row=1, sticky="S")
L1 = tk.Label(master=mainframe, text="Label2").grid(column=2, row=1, sticky="S")
L1 = tk.Label(master=mainframe, text="Label3").grid(column=3, row=1, sticky="S")
tk.Button(master=mainframe, text="Open Targetslist", command=OpenTargetsButton).grid(column=1,row=3,sticky="W")
tk.Button(master=mainframe, text="Save Output", command=WriteOutButton).grid(column=2,row=3,sticky="E")
tk.Button(master=mainframe, text="Go", command=lambda: sequence(FilterList(file_path),\
                                                          GetIP_Mac(targethostlist),\
                                                          WriteOutput(Out_path))).\
                                                          grid(column=2, row=4, sticky="SE")

#bind key to a command
mainframe.bind('<Return>', lambda: sequence(FilterList(file_path),GetIP_Mac(targethostlist),WriteOutput(Out_path)))
mainframe.mainloop()

运行 这显示:

如您所见,标签重叠...而且一切也不均匀且凌乱。

我现在的问题是我无法将 Pack() 应用于 L1L2L3 或任何类似的东西。

做:L1.Pack(side="bottom") 告诉我“没有属性 'pack'”。当我尝试在那里删除 grid(...) 配置时,又出现了另一个错误:

_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid

那么..我做错了什么?

编辑: 正如下面的答案中所说,在最后一个错误中,我不得不使用一个几何管理器。我在(唯一的)window 容器上单独使用 grid,所以效果很好。现在其实很简单。

您在同一个 window 中使用 gridpack。 Tkinter 只能在 window 中处理一个几何管理器,所以决定你是想要 grid 还是 pack.

两件事。首先,pack 是小写的。我不知道那是错字还是你的代码中有它。

现在最主要的是:每个容器只有一种类型的几何管理器。

如果您将某些东西装入容器中,那么直接进入该容器的所有其他物品也必须装入容器中。

这并不是说在你的整个 tkinter 程序中只能使用一种几何管理,只是每个容器。

容器可以是:TopLevel(window)、Frame、LabelFrame、PanedWindow 或 NoteBook。换句话说,您将其他小部件放入的任何小部件。

因此,如果您从主 Tk 实例开始,一个 TopLevel,然后将小部件放入其中,无论您使用哪种方法 (grid/pack/place),您都必须使用该容器直接包含的所有小部件。

但是,如果这些小部件之一本身就是一个容器,比如一个框架,您可以使用不同的几何管理方法在该小部件内部排列小部件。