2016-09-29 4 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を使用する場合の一般的な解決策の1つは、メインコンテンツの両側に1つの列(および/または行)を空にすることです。これらの列または行に重みを与えます。視覚的な結果は、エッジが余分なスペースをすべて占めるため、空の列の内部のすべてが中央に置かれていることです。ただし、他の列にも重みがある場合は、複雑になる可能性があります。

おそらくもっと良い解決策は、グループとして扱うすべてのものをフレームに配置することです。それから心配する必要があるのは、その1つのフレームをセンタリングすることだけです。実際には、これは実際にはFrameウィジェットが存在する正確な理由です。関連するウィジェットをグループ化し、それらが単一のオブジェクトとして扱われる限りレイアウトとして扱うことができます。

この回答の最後に、後者のテクニックの例があります。この場合、フレームを中央に配置するためにplaceが使用されています。これは非常に簡単なオプションです。必要に応じてpackまたはgridを適切なオプションで使用できます。

この例では、すべてのレイアウトコマンドをまとめてグループ化しました。私の経験では、視覚化がはるかに容易になり、時間の経過とともにコードを維持するのがずっと簡単になりました。正確なレイアウトは、私ができる限りあなたのコードを少し触れようとしたので、どうやってそれを行うのか正確には分かりません。

私は1つの新しいウィジェット、inner_frameを追加し、1つのウィジェット、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() 
関連する問題