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

时间:2015-04-12 20:28:19

标签: python user-interface tkinter

所以,我第一次尝试使用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()

运行此显示:

enter image description here

正如你所看到的,标签是重叠的......而且一切都是不均匀和混乱的。

我现在的问题是,我无法将Pack()应用于L1L2L3或任何相似内容。

执行:L1.Pack(side="bottom")告诉我“Theres no attribute'pack''。当我尝试删除那里的grid(...)配置时,又给了我一个错误:

  

_tkinter.TclError:无法在里面使用几何管理器包。已经有网格管理的奴隶

那么......我在这里做错了什么?

编辑:如下面的答案所述,在上一个错误中,我不得不使用一个几何管理器。我在(仅)窗口容器上单独使用grid,因此效果很好。实际上很简单。

2 个答案:

答案 0 :(得分:1)

您在同一窗口中使用gridpack。 Tkinter只能在窗口中处理一个几何管理器,因此决定是否需要gridpack

答案 1 :(得分:1)

两件事。首先,pack是小写的。我不知道这是不是一个错误,或者你的代码中是否有它。

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

如果您将某物品装入容器中,则还必须打包直接进入该容器的所有其他物品。

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

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

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

但是,如果其中一个窗口小部件本身就是一个容器,比如一个框架,则可以使用不同的几何管理方法来安排窗口小部件中的窗口小部件。