我正在寻找一种方法将文本放在GUI的中心。当GUI窗口扩展时,文本需要保持居中。
我也试图保持文本彼此对齐。 当我放入空标签时,我取得了成功,但这并不是非常优雅,当我将GUI全屏显示时,它不再是中心。
有什么建议吗?
from Tkinter import *
import ttk
import csv
master = Tk()
master.option_add("*Font", "{Bodoni MT} 8")
content = ttk.Frame(master, padding=(12, 12, 12, 12))
frame = ttk.Frame(content, borderwidth=5, relief="groove", width=300, height=100)
content.grid(column=0, row=0, sticky=(N, S, E, W))
frame.grid(column=0, row=0, columnspan=4, sticky=(N, E, W))
text = Text(content, height=8, width=13)
text.grid(row=0, column=4, columnspan=2, rowspan=2, sticky=(N, S, E, W))
v1surface = StringVar()
v2surface = StringVar()
v1tournament = StringVar()
v2tournament = StringVar()
empty_row = Label(frame).grid(column=1, padx=100, sticky=(N, E, W))
surface_title = Label(frame, text="Surface", font="{Bodoni MT} 12 bold underline").grid(row=1, column=2, columnspan=2)
surface_selection = Label(frame, text="Select Surface:").grid(row=2, column=2, sticky='w')
a_surface = Label(frame, text="Service Points Win %:").grid(row=3, column=2, sticky='w')
aa_surface = Entry(frame, text="value", textvariable=v1surface, justify='center', width=10).grid(row=3, column=3)
b_surface = Label(frame, text="Return Points Win %: ").grid(row=4, column=2, sticky='w')
bb_surface = Entry(frame, text="value", textvariable=v2surface, justify='center', width=10).grid(row=4, column=3)
tournament_title = Label(frame, text="Tournament", font="{Bodoni MT} 12 bold underline")\
.grid(row=1, column=5, columnspan=2)
tournament_selection = Label(frame, text="Select Tournament:").grid(row=2, column=5, sticky='w')
a_tournament = Label(frame, text="Service Points Win %:").grid(row=3, column=5, sticky='w')
aa_tournament = Entry(frame, text="value", textvariable=v1tournament, justify='center', width=10).grid(row=3, column=6)
b_tournament = Label(frame, text="Return Points Win %: ").grid(row=4, column=5, sticky='w')
bb_tournament = Entry(frame, text="value", textvariable=v2tournament, justify='center', width=10).grid(row=4, column=6)
run = ttk.Button(content, text='Run')
run.grid(column=4, row=3)
cancel = ttk.Button(content, text="Cancel", command=master.destroy)
cancel.grid(column=5, row=3)
master.columnconfigure(0, weight=1)
master.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=3)
content.columnconfigure(1, weight=3)
content.columnconfigure(2, weight=3)
content.columnconfigure(3, weight=1)
content.columnconfigure(4, weight=1)
content.rowconfigure(1, weight=1)
master.geometry("1000x500+100+100")
master.mainloop()
答案 0 :(得分:0)
有很多方法可以达到你想要的效果。
使用grid
时的一个常见解决方案是在主要内容的每一侧留空一列(和/或行)。为这些列或行赋予权重。视觉效果是那些空的columsn内部的所有东西都保持居中,因为边缘占据了所有额外的空间。但是,如果你有其他列也有重量,这可能会变得复杂。
一个可以说是更好的解决方案是将您想要处理的所有内容作为一个组放入一个框架中,然后您只需要担心的是将该框架置于中心位置。实际上,这正是Frame
窗口小部件存在的确切原因 - 允许您对相关窗口小部件进行分组,并将布局视为单个对象。
这个答案的结尾是后一种技术的一个例子。在这种情况下,它使用place
来使框架居中,因为它具有使这非常简单的选项。如果您愿意,可以使用pack
或grid
使用适当的选项。
在示例中,我还将所有布局命令组合在一起。根据我的经验,它使得可视化变得更加容易,并且随着时间的推移更容易维护代码。确切的布局并不是我想要的方式,因为我尽可能少地触摸你的代码。
请注意,我添加了一个新窗口小部件inner_frame
,并删除了一个窗口小部件empty_row
。然后我将内框架置于另一个框架内(名为frame
的框架)。最后,我将所有标签和条目的父级设置为内部框架。
from Tkinter import *
import ttk
import csv
master = Tk()
master.option_add("*Font", "{Bodoni MT} 8")
content = ttk.Frame(master, padding=(12, 12, 12, 12), borderwidth=2, relief="groove")
frame = ttk.Frame(content, borderwidth=5, relief="groove", width=300, height=100)
text = Text(content, height=8, width=13)
v1surface = StringVar()
v2surface = StringVar()
v1tournament = StringVar()
v2tournament = StringVar()
inner_frame = Frame(frame)
surface_title = Label(inner_frame, text="Surface", font="{Bodoni MT} 12 bold underline")
surface_selection = Label(inner_frame, text="Select Surface:")
a_surface = Label(inner_frame, text="Service Points Win %:")
aa_surface = Entry(inner_frame, text="value", textvariable=v1surface, justify='center', width=10)
b_surface = Label(inner_frame, text="Return Points Win %: ")
bb_surface = Entry(inner_frame, text="value", textvariable=v2surface, justify='center', width=10)
tournament_title = Label(inner_frame, text="Tournament", font="{Bodoni MT} 12 bold underline")\
.grid(row=1, column=5, columnspan=2)
tournament_selection = Label(inner_frame, text="Select Tournament:").grid(row=2, column=5, sticky='w')
a_tournament = Label(inner_frame, text="Service Points Win %:").grid(row=3, column=5, sticky='w')
aa_tournament = Entry(inner_frame, text="value", textvariable=v1tournament, justify='center', width=10).grid(row=3, column=6)
b_tournament = Label(inner_frame, text="Return Points Win %: ").grid(row=4, column=5, sticky='w')
bb_tournament = Entry(inner_frame, text="value", textvariable=v2tournament, justify='center', width=10).grid(row=4, column=6)
run = ttk.Button(content, text='Run')
cancel = ttk.Button(content, text="Cancel", command=master.destroy)
# main layout
content.grid(column=0, row=0, sticky=(N, S, E, W))
frame.grid(column=0, row=0, columnspan=4, sticky=(N, E, W))
text.grid(row=0, column=4, columnspan=2, rowspan=2, sticky=(N, S, E, W))
run.grid(column=4, row=3)
cancel.grid(column=5, row=3)
# inner frame, used for centering
inner_frame.place(relx=.5, rely=.5, anchor="c")
# widgets in the inner frame
surface_title.grid(row=1, column=2, columnspan=2)
surface_selection.grid(row=2, column=2, sticky='w')
a_surface.grid(row=3, column=2, sticky='w')
aa_surface.grid(row=3, column=3)
b_surface.grid(row=4, column=2, sticky='w')
bb_surface.grid(row=4, column=3)
master.columnconfigure(0, weight=1)
master.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=3)
content.columnconfigure(1, weight=3)
content.columnconfigure(2, weight=3)
content.columnconfigure(3, weight=1)
content.columnconfigure(4, weight=1)
content.rowconfigure(1, weight=1)
master.geometry("1000x500+100+100")
master.mainloop()