2016-09-29 129 views
0

我正在寻找一种方法将我的文本放置在我的GUI中心。当GUI窗口展开时,文本需要保持居中。框架内的文本位置 - Python

我也试图保持文本彼此对齐。 当我放入空标签时,我很成功,但这不是非常优雅,而且当我将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

@BryanOakley,我希望'框架'中的所有标签和输入小部件居中 – Depekker

+0

您是否想要它们居中的框架?或者你想要框架在顶部和小部件在框架中居中? –

回答

0

有很多方法可以完成你想要的。

使用grid时的一个常见解决方案是在主内容的每一侧留出一列(和/或一行)为空。为这些列或行赋予一个权重。视觉效果是这些空柱子内的所有东西都保持居中,因为边缘占据了所有额外的空间。但是,如果您有其他也有重量的列,这可能会变得很复杂。

一个可以说是更好的解决方案是将所有你想要看作一个组的东西放到一个框架中,然后你所担心的就是把这个框架放在中心位置。实际上,这实际上就是Frame小部件存在的确切原因 - 允许您将相关小部件分组并将其视为单个对象,就布局而言。

在这个答案的结尾是后一种技术的一个例子。在这种情况下,它使用place来使框架居中,因为它具有使这非常简单的选项。如果您愿意,可以使用packgrid以及适当的选项。

在该示例中,我还将所有布局命令组合在一起。根据我的经验,它使得可视化变得更容易,而且随着时间的推移维护代码变得更容易。确切的布局并不完全如此,因为我试图尽可能少地触及代码。

请注意,我添加了一个新的小部件,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()