在框架中将一组小部件居中对齐

4
如果一个框架的行中只有一个小部件,可以使用 sticky= 将其对齐到任何一侧,或者通过省略 sticky 进行居中对齐。
然而,当行中有多列时,它们中的对象最终会左对齐: left-aligned 而我希望它们保持在中心位置(同时保持大小)。
代码摘录:
from Tkinter import N,W,S,E,Tk
import ttk
import Tkinter as tkinter

root = Tk()
mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

tv_town_fr = ttk.Frame(mainframe)
tv_town_fr.grid(row=3, sticky=(W,E))

tv_town_add = ttk.Button(tv_town_fr,text="+",width=4)
tv_town_add.grid(row=1,column=1)
tv_town_edit = ttk.Button(tv_town_fr,text="*",width=4)
tv_town_edit.grid(row=1,column=2)
tv_town_del = ttk.Button(tv_town_fr,text="-",width=4)
tv_town_del.grid(row=1,column=3)
tv_town_up = ttk.Button(tv_town_fr,text=u"↑",width=4)
tv_town_up.grid(row=1,column=4)
tv_town_down = ttk.Button(tv_town_fr,text=u"↓",width=4)
tv_town_down.grid(row=1,column=5)

tv_query_fr = ttk.Frame(mainframe)
tv_query_fr.grid(row=6, sticky=(W,E))

tv_query_add = ttk.Button(tv_query_fr,text="+",width=5)
tv_query_add.grid(row=1,column=1)
tv_query_edit = ttk.Button(tv_query_fr,text="*",width=5)
tv_query_edit.grid(row=1,column=2)
tv_query_del = ttk.Button(tv_query_fr,text="-",width=5)
tv_query_del.grid(row=1,column=3)
tv_query_up = ttk.Button(tv_query_fr,text=u"↑",width=5)
tv_query_up.grid(row=1,column=4)
tv_query_down = ttk.Button(tv_query_fr,text=u"↓",width=5)
tv_query_down.grid(row=1,column=5)

提供您正在使用的最小代码。 - AD WAN
我认为我们不需要编写创建10个按钮的代码来重现这个问题。两到三个按钮就足够了。 - Bryan Oakley
@BryanOakley 我不知道如何明确地将框架设置为比按钮更宽(Frame(width=)没有效果)。因此,为示例留下了两行。 - ivan_pozdeev
1个回答

8
使用grid水平居中一组小部件的最简单解决方案是创建一个空列在所有可见项左右,然后给这些列分配权重,以便所有额外的空间都分配给空列。

示例

import Tkinter as tk

root = tk.Tk()
root.geometry("400x200")

label = tk.Label(root, text="Hello, world")
buttons = tk.Frame(root)
label.pack(side="top", fill="both", expand=True)
buttons.pack(side="bottom", fill="x")

b1 = tk.Button(buttons, text="one")
b2 = tk.Button(buttons, text="two")
b3 = tk.Button(buttons, text="three")

b1.grid(row=0, column=1)
b2.grid(row=0, column=2)
b3.grid(row=0, column=3)

# give empty columns a weight so that the consume
# all extra space
buttons.grid_columnconfigure(0, weight=1)
buttons.grid_columnconfigure(4, weight=1)

root.mainloop()

那么,我可以通过调用grid_columnconfigure来创建一个空列吗?http://www.tkdocs.com/tutorial/grid.html似乎暗示没有任何小部件的列号会被简单地忽略。 - ivan_pozdeev
3
@ivan_pozdeev:空列不会被忽略。只是默认设置会使得空行和列在布局上没有任何影响。 - Bryan Oakley
我认为在同一个脚本中不能同时使用pack和grid。 - ghost21blade
1
@ghost21blade:你可以在同一个脚本中同时使用它们,但不能在具有相同父级的小部件上同时使用它们。 - Bryan Oakley
哦,这就是为什么我不能同时使用pack和grid。我在同一个父容器中使用了它们。 - ghost21blade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接