Pythonクローラー、データ分析、Webサイト開発、その他のケースチュートリアルビデオはオンラインで無料で視聴できます
https://space.bilibili.com/523606542
序文
レイアウトマネージャーとは何ですか?率直に言って、コンポーネントの配置方法を管理するのはその人です。Tkinterには、パック、グリッド、場所の3つのレイアウトマネージャーがあります。
パックは、追加順にコンポーネントを配置することです。
グリッドは、コンポーネントを行/列に配置することです。
placeを使用すると、プログラマーはコンポーネントのサイズと場所を指定できます。
パック
実際、前の例ではpackを使用しました。グリッドマネージャーと比較すると、packは少数のコンポーネントの配置に適していますが、使いやすいです。比較的複雑なレイアウト構造を作成する必要がある場合は、複数フレーム(フレーム)構造を使用するか、グリッドマネージャーを使用して実現することをお勧めします。
同じ親コンポーネントでパックとグリッドを混在させないでください。Tkinterは最初に使用するレイアウトマネージャーを慎重に計算するため、30分待っても、Tkinterはまだ絡み合っていて、結果は得られませんでした。
私たちがよく遭遇する状況は、コンポーネントをコンテナコンポーネントに入れて、親コンポーネント全体を埋めることです。以下は、リストボックスコンポーネントを生成し、それをルートウィンドウに入力します。
import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack(fill=tk.BOTH, expand=True)
for i in range(10):
listbox.insert(tk.END, str(i))
root.mainloop()
その中で、塗りつぶしオプションは、コンポーネントが割り当てられたスペース全体を埋めることをウィンドウマネージャーに指示します。両方とも、水平方向と垂直方向の同時拡張を意味し、Xは水平方向、Yは垂直方向を意味します。展開オプションは、ウィンドウマネージャーに次のスペースを追加するように指示します。親コンポーネントがいっぱいになります。
デフォルトでは、packは追加されたコンポーネントを垂直に配置します。
import tkinter as tk
root = tk.Tk()
tk.Label(root,text="Red",bg="red",fg="white").pack(fill=tk.X)
tk.Label(root,text="Green",bg="green",fg="black").pack(fill=tk.X)
tk.Label(root,text="Blue",bg="blue",fg="white").pack(fill=tk.X)
tk.mainloop()
コンポーネントを並べて配置する場合は、sideオプションを使用できます。
import tkinter as tk
root = tk.Tk()
tk.Label(root,text="Red",bg="red",fg="white").pack(side=tk.LEFT)
tk.Label(root,text="Green",bg="green",fg="black").pack(side=tk.LEFT)
tk.Label(root,text="Blue",bg="blue",fg="white").pack(side=tk.LEFT)
tk.mainloop()
グリッド
グリッドマネージャーは、Tkinterの3つのレイアウトマネージャーの中で最も柔軟性があると言えます。ダイアログボックスを設計する場合、グリッドの使用は特に便利です。以前にpackを使用してウィンドウレイアウトを作成したことがある場合は、グリッドを学習した後、早く学習しなかった理由を後悔するでしょう。グリッドを使用すると、多くのフレームワークやパックで構築した効果を簡単に実現できます。
グリッドを使用してコンポーネントを配置し、コンポーネントを配置する場所を指定します(行/列、行オプションは行を指定し、cloumnオプションは列を指定します)。さらに、マネージャーが自動的に計算するため、事前にグリッドのサイズを指定する必要はありません(グリッドがコンポーネントに分散される場所はグリッドと呼ばれます)。
import tkinter as tk
root = tk.Tk()
# column默认值是0
tk.Entry(root).grid(row=0, column=0)
tk.Entry(root).grid(row=0, column=1)
tk.Entry(root).grid(row=0, column=3)
tk.Entry(root).grid(row=1, column=0)
# tk.Entry(root).grid(row=1, column=1)
tk.Entry(root).grid(row=1, column=3)
tk.mainloop()
ログインフォーム
import tkinter as tk
root = tk.Tk()
root.geometry("300x300+150+150")
# column默认值是0
tk.Label(root, text="用户名").grid(row=0, column=0, sticky=tk.W)
tk.Entry(root) .grid(row=0, column=1)
tk.Label(root, text="密码") .grid(row=1, column=0, sticky=tk.W)
tk.Entry(root, show="*") .grid(row=1, column=1)
tk.mainloop()
デフォルトでは、コンポーネントは対応するグリッドの中央に表示されます。スティッキーオプションを使用してこの機能を変更できます。このオプションに使用できる値は、E、W、S、Nです(EWSNはそれぞれ東、西、南、北を意味します。つまり、上、北、下、南、左、西、右、東を意味します)およびそれらの組み合わせ。したがって、sticky = Wを使用して、ラベルを左に揃えることができます。
tk.Label(root, text="密码") .grid(row=1, column=0, sticky=tk.W)
tk.Entry(root, show="*") .grid(row=1, column=1)
コンポーネントを配置するために複数のグリッドを使用する必要がある場合がありますが、それは可能ですか?もちろん、行間および列間の機能を実現するには、行スパンと列スパンを指定するだけで済みます。
行と列にまたがるレイアウト
import tkinter as tk
root = tk.Tk()
# column默认值是0
tk.Label(root, text="用户名").grid(row=0,column=0,sticky=tk.W)
tk.Entry(root) .grid(row=0, column=1)
tk.Label(root, text="密码") .grid(row=1, column=0, sticky=tk.W)
tk.Entry(root, show="*") .grid(row=1, column=1)
photo = tk.PhotoImage(file="../../../assets/logo.png")
tk.Label(root,image=photo).grid(row=0,column=2,rowspan=2, padx=5, pady=5)
tk.Button(text="提交",width=10).grid(row=2,column=0,columnspan=3, pady=5)
tk.mainloop()
場所
一般に、プレイスレイアウトマネージャーを使用することはお勧めしません。パックやグリッドと比較して、プレイスはより多くの作業を行う必要があるためです。ただし、純粋さは合理的であり、場所はいくつかの特別な状況で魔法の役割を果たすことができます。以下の例をご覧ください。
placeを使用すると、親コンポーネントの中央に子コンポーネントを表示できます。
import tkinter as tk
root = tk.Tk()
def callback():
print("正中靶心")
tk.Button(root, text="点我",command=callback).place(relx=0.5, rely=0.5, anchor=tk.CENTER)
tk.mainloop
場合によっては、あるコンポーネントが別のコンポーネントをカバーするようにしたい場合は、場所が再び役立つことがあります。次の例は、Buttonを使用してLabelコンポーネントをカバーする方法を示しています。
import tkinter as tk
root = tk.Tk()
def callback():
print("正中靶心")
photo = tk.PhotoImage(file="../../assets/logo.png")
tk.Label(root, image=photo).pack()
tk.Button(root, text="点我",command=callback).place(relx=0.5, rely=0.5, anchor=tk.CENTER)
tk.mainloop()
コンポーネントをカバーする場所を使用する
relxオプションとrelyオプションで、親コンポーネントに対する相対的な位置が00から1.0の範囲で指定されていることを確認するのは難しくありません。したがって、0.5は中央にあることを意味します。次に、相対幅と相対高さのオプションで、親コンポーネントを基準にしたサイズを指定します。
相対位置と相対サイズ
import tkinter as tk
root = tk.Tk()
tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=tk.CENTER)
tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=tk.CENTER)
tk.Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=tk.CENTER)
tk.mainloop()
上記のコードに関しては、ウィンドウを変更するためにどのようにストレッチしても、3つのラベルの寸法が同期されます。