Tkinter チュートリアル - レイアウトマネージャー
前のセクションでは、ラベル、ボタン、ドロップダウンメニューなど、いくつかの Tkinter ウィジェットタイプを紹介しました。また、これらのウィジェットをプログラムウィンドウにレイアウトする方法についても簡単に説明しました。これが、このセクションで学ぶ重要なポイントである Tkinter のレイアウトマネージャーです。
Tkinter は 3つのレイアウト方法、pack
、grid
、place
方法があります。それらを一つ一つ紹介します。
Tkinter pack
レイアウト方法
pack
メソッドは、文字通り示されているように、作成された後、ウィジェットをウィンドウフレームにパックします。このレイアウト方法は、すべてのオプションもリストされている Tkinter ラベルのセクションで説明してい pack
ます。
pack
メソッド(およびそのオプション)でウィジェットをレイアウトする方法を示します。いくつかの例は、正しい構成を示すのに役立ちます。
Tkinter pack
レイアウト-相対位置
import tkinter as tk
app = tk.Tk()
app.geometry("300x200")
buttonW = tk.Button(app, text="West", width=15)
buttonW.pack(side="left")
buttonE = tk.Button(app, text="East", width=15)
buttonE.pack(side="right")
app.mainloop()
プログラムを実行すると、次のようなウィンドウが表示されます。
ご覧のとおり、buttonWest
ボタンはウィンドウの左側にスナップし、buttonEast
ボタンはウィンドウの右側にスナップします。ウィンドウのサイズを拡大縮小してみてもいいです。まだウィンドウの両側にくっついています。相対位置は変わりません。
buttonW.pack(side="left")
side
は 4つのオプションがあります-
top
bottom
left
right
ウィジェットを side
ウィンドウ上に配置します。例に示されているように、buttonW
は、ウィンドウの左側に置かれています。なぜなら side='left'
。buttonE
は、ウィンドウの右側にあります、side=right
ですから。
興味深いシナリオがあります。2つのウィジェットの side
プロパティが同じ場合、レイアウトはどうなりますか?
自分で答えるか、次のコードを実行して確認してください。
import tkinter as tk
app = tk.Tk()
app.geometry("300x200")
buttonW = tk.Button(app, text="West", width=15)
buttonW.pack(side="left")
buttonE1 = tk.Button(app, text="East 1", width=15)
buttonE1.pack(side="right")
buttonE2 = tk.Button(app, text="East 2", width=15)
buttonE2.pack(side="right")
app.mainloop()
Tkinter pack
ウィジェットの内部および外部パディングを追加する
場合によっては、ウィジェット間、およびウィジェットテキストとウィジェット境界間の混雑が少なくなるように、ウィジェットの内側または外側にパディングを追加する必要があります。この場合は、ipadx
、ipady
、ipadx
と ipadx
のオプションが必要します。
import tkinter as tk
app = tk.Tk()
app.geometry("300x200")
buttonW = tk.Button(app, text="West")
buttonW.pack(side="left", ipadx=20, padx=30)
buttonE = tk.Button(app, text="East")
buttonE.pack(side="right", ipadx=20, padx=30)
app.mainloop()
二つのボタンは、内側に 20 単位のパディングを追加し、外側に 30 単位を追加します。x
単位はピクセルですが、1 文字の幅ではありません。
Tkinter pack
レイアウトの x、y 方向のパディング
次のコードが実現する機能は、ウィンドウのサイズが同じウィンドウの幅や高さなどに自動的に塗り込められます。また、ウィンドウをスケーリングすると、コントロールのサイズも自動的にウィンドウのサイズに合わせて変化します。
import tkinter as tk
app = tk.Tk()
app.geometry("300x200")
buttonX = tk.Button(app, text="Fill X", bg="red", height=5)
buttonX.pack(fill="x")
buttonY = tk.Button(app, text="Fill Y", bg="green", width=10)
buttonY.pack(side="left", fill="y")
app.mainloop()
butonX.pack(fill='x')
は buttonX
ウィジェットの幅がウィンドウ全体の幅を埋めることを意味します。同様に、fill='y'
がウィジェットの高さをウィンドウ全体の高さを満たすまで伸ばしたら、fill='both'
は X と Y 方向の結合で、自動的に幅と高さ方向にウィンドウ全体を埋めます。
Tkinter pack
レイアウト expand
オプション-自動展開ウィジェット
上記 fill=
オプションは、ウィンドウをドラッグ&ドロップすると自動的にウィジェットを x と y 方向に塗りつぶします。それと似たような需要がありますが、もしウィンドウにたくさんの内容があるとしたら、リスト要素のように、その内容を自動的に全部表示したらどうですか?
import tkinter as tk
import calendar
app = tk.Tk()
buttonX = tk.Button(app, text="Label ", bg="blue", height=5)
buttonX.pack(fill="x")
listboxA = tk.Listbox(app, width=10)
listboxA.pack(fill="both", expand=1)
for i in range(1, 13):
listboxA.insert(tk.END, calendar.month_name[i])
app.mainloop()
expand=True or 1
の場合、リストボックスは、上の例で示したように、リスト内のすべての要素を展開します。たとえば、Januar
から December
まで表示します。
expand
が False
に設定されている場合、リストボックスにはデフォルトで最初の 10 要素のみが表示されます。リストボックスを選択した後、マウスまたは方向キーを使用して非表示のアイテムを表示します。必要があります。
listboxA.pack(fill="both", expand=0)
expand=0
を通じて、リストボックスが自動的にすべての要素を展開することを禁止しました。
Tkinter grid
レイアウト方法
Tkinter grid
もまた、最も重要なレイアウトジオメトリメソッドです。これは、すべてのジオメトリマネージャの中で 1つのメソッドのみを学習する場合に学習する必要があるものです。
grid
はダイアログボックスでよく使用されますが、グリッドの位置座標に基づいてウィジェットを配置できます。grid
レイアウト方法は、すべてのウィジェットの安定した相対位置を持つことができます。
次の例では、上記の例と比較して複雑な GUI を作成します。この例で grid
は、次のセクションで説明するできるだけ多くのオプションを使用します。
import tkinter as tk
app = tk.Tk()
labelWidth = tk.Label(app, text="Width Ratio")
labelWidth.grid(column=0, row=0, ipadx=5, pady=5, sticky=tk.W + tk.N)
labelHeight = tk.Label(app, text="Height Ratio")
labelHeight.grid(column=0, row=1, ipadx=5, pady=5, sticky=tk.W + tk.S)
entryWidth = tk.Entry(app, width=20)
entryHeight = tk.Entry(app, width=20)
entryWidth.grid(column=1, row=0, padx=10, pady=5, sticky=tk.N)
entryHeight.grid(column=1, row=1, padx=10, pady=5, sticky=tk.S)
resultButton = tk.Button(app, text="Get Result")
resultButton.grid(column=0, row=2, pady=10, sticky=tk.W)
logo = tk.PhotoImage(file="python.gif")
labelLogo = tk.Label(app, image=logo)
labelLogo.grid(
row=0,
column=2,
columnspan=2,
rowspan=2,
sticky=tk.W + tk.E + tk.N + tk.S,
padx=5,
pady=5,
)
app.mainloop()
Tkinter grid
column
と row
オプション
labelWidth.grid(column=0, row=0, ipadx=5, pady=5, sticky=tk.W + tk.N)
grid
のレイアウトでは、各ウィジェットは固定されたセルに配置されます。各セルの座標は、column
と row
によって決定されます。
labelWidth
ウィジェットは座標の (0, 0)
セルに配置されます。座標はウィンドウの左上隅を座標系の原点とします。
ipadx
は、ipad
と padx
と pady
が前に紹介した pack
レイアウト方法と同じ名前のオプションです。コントロールは内部と外部の充填間隔です。
ipadx
、ipady
、padx
および pady
は前述の pack
レイアウトメソッドの同名のオプションと同じ意味を持ち、ウィジェットの内側と外側のパディング間隔です。
Tkinter grid
sticky
オプション
sticky
はウィジェットがセルより小さい場合に、ウィジェットがセルにどのように貼り付くかを決定します。
sticky |
意味 |
---|---|
W |
左揃え |
E |
右揃え |
N |
上揃え |
S |
下揃え |
sticky
のデフォルトオプションは中央揃え、つまり W+E+N+S
です。
Tkinter columnspan
と rowspan
オプション
labelLogo.grid(
row=0,
column=2,
columnspan=2,
rowspan=2,
sticky=tk.W + tk.E + tk.N + tk.S,
padx=5,
pady=5,
)
labelLogo
では、セルの座標は (column=2, row=0)
であり、logo
のサイズは比較的大きいため、2x2
セルサイズが割り当てられます。columnspan=2
また rowspan=2
、ウィジェットには、ウィジェットの位置から開始する方向 X
と Y
方向の両方の 2つのセルのスパンがあることを意味します。
Tkinter place
メソッド
Tkinter place
メソッドは、ウィジェットをウィンドウ内の絶対位置または相対位置に配置します。上記と同じアプローチを使用して、このレイアウト方法のオプションを紹介します。
import tkinter as tk
app = tk.Tk()
app.geometry("300x300")
labelA = tk.Label(app, text="Label (0, 0)", fg="blue", bg="#FF0")
labelB = tk.Label(app, text="Label (20, 20)", fg="green", bg="#300")
labelC = tk.Label(app, text="Label (40, 50)", fg="black", bg="#f03")
labelD = tk.Label(app, text="Label (0.5, 0.5)", fg="orange", bg="#0ff")
labelA.place(x=0, y=0)
labelB.place(x=20, y=20)
labelC.place(x=40, y=50)
labelD.place(relx=0.5, rely=0.5)
app.mainloop()
Tkinter の place
絶対位置
labelA.place(x=0, y=0)
labelB.place(x=20, y=20)
place
の x=
と y=
オプションは、ピクセルとして単位を持つウィジェットの絶対位置を決定します。たとえば、lableB.place(x=20, y=20)
は座標 (20, 20)
の位置に labelB
を配置することを意味します。
Tkinter の place
相対位置
絶対位置の欠点は、相対位置で配置されたウィンドウに他のウィジェットがある場合、ウィンドウがズームされると、絶対位置レイアウトを使用するウィジェットが他のウィジェットと重複する可能性があることです。
place
レイアウト方法には相対位置オプションもあります。つまり、
labelD.place(relx=0.5, rely=0.5)
relx
と rely
は 0.0~1.0
の範囲内にあります。ウィンドウサイズに対するウィジェットの位置の相対的な割合です。
たとえば relx=0.5, rely=0.5
は、ウィジェットがウィンドウの幅の 50%とウィンドウの高さの 50%に配置されることを意味します。
relx = 1.0
の位置はウィンドウの右境界線であり、rely = 1.0
の位置はウィンドウの下部境界線です。