2016-09-29 131 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()