如何将两个按钮并排放置?
b = Button(root, text="Enter", width=10, height=2, command=button1)
b.config()
b.pack(side=LEFT)
c = Button(root, text="Clear", width=10, height=2, command=clear)
c.pack(side=LEFT)
scrollbar = Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)
text.config(width=35, height=15)
text.pack(side=RIGHT, fill=Y)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
我该怎么把这两个按钮放在文本框上面并排显示呢?当我设置“side=LEFT”时,它只是把这两个按钮放在了文本框旁边。
1 个回答
这种问题通常有两种解决方案。没有哪一种在所有情况下都比另一种更好,或者在这个特定的例子中更好。两种方案都是可以接受的。
方案一:使用两个容器(通常是框架)。一个用来放水平的东西,一个用来放垂直的东西。在这个例子中,根窗口可以作为垂直排列项目的容器。把两个按钮放在水平框架里(使用pack(side=LEFT)),然后把这个框架放在文本控件的上面(使用pack(side=TOP))。
方案二:使用网格布局管理器,它会把你的界面放在一个网格里。把按钮放在0,1和0,2的单元格里,把文本控件放在1,1,并跨越两列。
通常,使用网格布局需要更多的前期规划。你需要弄清楚哪些项目需要跨越列或行,哪些列或行在调整大小时应该增长或缩小等等。对于像这样的简单布局,使用pack的方案是“最简单的”(当然,这里的“简单”是有定义的)。
使用框架来包含一组控件的这种一般方法是个好主意。这样可以方便地管理整组控件,并且可以灵活地组合左右排列的控件和上下排列的控件。
这是我使用多框架技术的做法。注意我把控件创建为根窗口的子控件,而不是内框架的子控件。这使得将来修改布局变得更简单,因为你只需要创建或删除不同的框架,而不需要修改控件的层级关系。
# create the main sections of the layout,
# and lay them out
top = Frame(root)
bottom = Frame(root)
top.pack(side=TOP)
bottom.pack(side=BOTTOM, fill=BOTH, expand=True)
# create the widgets for the top part of the GUI,
# and lay them out
b = Button(root, text="Enter", width=10, height=2, command=button1)
c = Button(root, text="Clear", width=10, height=2, command=clear)
b.pack(in_=top, side=LEFT)
c.pack(in_=top, side=LEFT)
# create the widgets for the bottom part of the GUI,
# and lay them out
text = Text(root, width=35, height=15)
scrollbar = Scrollbar(root)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(in_=bottom, side=RIGHT, fill=Y)
text.pack(in_=bottom, side=LEFT, fill=BOTH, expand=True)
下面是一个使用网格的简单实现。它有不同的调整大小行为,这可能是你想要的,也可能不是。这真的取决于你希望的调整大小行为。通常我会用一个框架来管理一行控件,然后使用网格来布局其他控件。在这个例子中,我会把所有东西都用网格来处理。
注意,除了管理控件所在的行和列外,你还需要决定行和列的权重因子。至少你需要选择一行和一列来“承担压力”,这通常意味着你的主要控件所在的列(通常是文本框、画布或另一个框架)也在这里。
b = Button(root, text="Enter", width=10, height=2, command=button1)
c = Button(root, text="Clear", width=10, height=2, command=clear)
b.grid(row=0,column=0, sticky=W)
c.grid(row=0,column=1, sticky=W)
textframe = Frame(root)
textframe.grid(in_=root, row=1, column=0, columnspan=3, sticky=NSEW)
root.columnconfigure(0, weight=1)
root.rowconfigure(1, weight=1)
text = Text(root, width=35, height=15)
scrollbar = Scrollbar(root)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(in_=textframe, side=RIGHT, fill=Y)
text.pack(in_=textframe, side=LEFT, fill=BOTH, expand=True)
在这个特定的情况下,我会选择第一种方法,也就是使用pack。对于更复杂的设计,我几乎总是会混合使用grid和pack。对于自然水平或垂直堆叠的项目(比如工具栏),使用pack。对于更复杂的布局(比如整个应用程序、带滚动条的控件、对话框等),使用grid。你不能在同一个容器中同时使用grid和pack,但你可以在一个容器中使用pack,在另一个容器中使用grid,等等。