この単純なレイアウトではgrid
、pack
またはその両方を使用できます。この特定のケースでは、どちらにも明らかな利点はありません。どちらも、必要なサイズ変更動作を備えています。
頭のてっぺんから、水平フレームを使用してボタンを保持し、ボタンをその中に詰め込みます. 次に、グリッドを使用して、ツールバー、テキスト ウィジェット、およびスクロールバーをフレーム内に配置します。パックも使用できますが、どちらでも機能します。それは右側の世話をします。
写真のようにメニューバーが必要な場合 (つまり、非標準、チェス盤の上のみ)、同様の手法を使用します: 上部にメニューバーが詰め込まれた左側の別のフレーム、下部にチェス盤。
次に、メイン ウィンドウで pack を使用し、下部にステータス バー、左側にチェス盤、右側にテキスト エリアを配置します。
ただし、標準のメニューバーを使用することをお勧めします。つまり、チェス盤とメニューバーの組み合わせを含むフレームは必要ありません。
これは、標準のメニューバーを使用した 1 つのソリューションの簡単なハックです。これは、ほとんどのウィジェットを親の子として配置し、in_
パラメーターを使用してそれらをコンテナーに配置する手法を使用します。これにより、階層全体を変更する必要がなく、コンテナー内のウィジェットの配置のみを変更する必要があるため、後でレイアウトを変更するのがはるかに簡単になります。
import Tkinter as tk
import random
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
size = 40
menubar = tk.Menu(self)
menubar.add_cascade(label="Game")
menubar.add_cascade(label="Options")
menubar.add_cascade(label="Help")
chessboard = tk.Canvas(width=8*size, height=8*size, borderwidth = 0,
highlightthickness=0)
statusbar = tk.Label(self, borderwidth=1, relief="sunken")
right_panel = tk.Frame(self, borderwidth = 1, relief="sunken")
scrollbar = tk.Scrollbar(orient="vertical", borderwidth=1)
# N.B. height is irrelevant; it will be as high as it needs to be
text = tk.Text(background="white",width=40, height=1, borderwidth=0, yscrollcommand=scrollbar.set)
scrollbar.config(command=text.yview)
toolbar = tk.Frame(self)
for i in range(10):
b = tk.Button(self, text="B%s" % i, borderwidth=1)
b.pack(in_=toolbar, side="left")
self.config(menu=menubar)
statusbar.pack(side="bottom", fill="x")
chessboard.pack(side="left", fill="both", expand=False)
toolbar.grid(in_=right_panel, row=0, column=0, sticky="ew")
right_panel.pack(side="right", fill="both", expand=True)
text.grid(in_=right_panel, row=1, column=0, sticky="nsew")
scrollbar.grid(in_=right_panel, row=1, column=1, sticky="ns")
right_panel.grid_rowconfigure(1, weight=1)
right_panel.grid_columnconfigure(0, weight=1)
if __name__ == "__main__":
app = App()
app.mainloop()