Python Tkinter:在同一帧的另一侧放置两个标签

时间:2017-06-28 07:16:48

标签: python user-interface tkinter geometry

在Tkinter中我有一个框架,它填充了我的根窗口的X维度。在这个框架内,我想放置两个标签:一个在左侧,一个在右侧。但是,我似乎仍然以错误的方式使用stickyfrom Tkinter import * root = Tk() root.geometry("250x200") myFrame = Frame(root, bd=1, relief="sunken") myFrame.pack(fill=X, padx=10) myLabel1 = Label(myFrame, text="left").grid(sticky=W) myLabel2 = Label(myFrame, text="right").grid(sticky=E) root.mainloop() 并需要您的建议:

myLabel1 = Label(myFrame, text="left").grid(row=0, sticky=W)
myLabel2 = Label(myFrame, text="right").grid(row=0, sticky=E)

此代码将两个标签放在左侧但彼此叠加。如果我把它们放在同一行

myLabel1 = Label(myFrame, text="left").grid(row=0, column=0, sticky=W)
myLabel2 = Label(myFrame, text="right").grid(row=0, column=1, sticky=E)

它们处于完全相同的位置,因此myLabel2涵盖myLabel1。

如果我这样做

grid

然后myLabel2确实是myLabel1的右边,但不是在框架的右侧(尽管框架没有调整大小)。

我想实际的问题是:如何让<a data-controls-modal="id" data-backdrop="static" data-keyboard="false" href="#"> 扩展到整个框架(在x维度上),这样粘性= E的确意味着“框架的右侧”而非“正确”第一列的一侧与myLabel1一样宽。“

2 个答案:

答案 0 :(得分:1)

为了将myLabel2放在框架的右侧,您需要使用myFrame.columnconfigure(1, weight=1),以便第1列将展开以填充框架。

如果你这样做

myFrame.columnconfigure(0, weight=1)
myFrame.columnconfigure(1, weight=1)

然后每列将占用一半的帧,但您也可以指定不同的权重以使一列大于另一列。您未指定任何重量的列会调整其宽度以适合其内容。

方法rowconfigure对行完全相同。

答案 1 :(得分:1)

  

我猜实际的问题是:如何让网格扩展到整个框架(在x维度上),这样粘性= E的确意味着“框架的右侧”,而不是“第一个框架的右侧”与myLabel1“

一样宽的列

对此的简短回答是确保在一个框架内,至少有一列具有非零权重。列的weight属性告诉tkinter如何分配任何额外的空间。默认值为零,表示列不会获得任何额外空间。额外的空间在最后一列和第一行的右侧和下方未使用。

注意:weight值可以是任何正整数。数字是相对的,因此权重为2将创建一个列,其额外空间是权重为1的列的两倍。

根据经验,您应始终指定至少一行和一列以具有正重量。通常这是“英雄”小部件(通常是画布或文本小部件),但它也可以是用作间隔符的空行或列。

布局高度依赖于容器中的所有内容。如果您只想要两个标签,我建议创建一个三列配置。 myLabel1可以进入第0列,myLabel2可以进入第2列,您可以将第1列配置为空并填充所有空白

myLabel1 = Label(...)
myLabel2 = Label(...)

myLabel1.grid(row=0, column=0, sticky="w")
myLabel2.grid(row=0, column=2, sticky="e")

myFrame.grid_columnconfigure(1, weight=1)
myFrame.grid_rowconfigure(0, weight=1)

另一种选择是仅使用两列,并让每列具有相同的权重,以便所有额外的空间在两列之间均匀分配。