3

チェッカー ゲームの現在の GUI レイアウトは次のとおりです。

チェッカーゲーム

ご覧のとおり、上部のメニュー、チェッカーボードを描画する左側のキャンバス、さまざまな書式設定/ナビゲーション ボタンがある右上のツールバー (フレーム)、および使用されるテキスト ウィジェットで構成されています。動きに注釈を付けます。現在、ウィジェットにグリッド レイアウトを使用しています。

これが私がする必要があることです:

  1. テキストの量がウィジェットのサイズよりも大きくなったときに、テキスト ウィジェットでスクロールバーを表示/非表示にできるようになりました。(この記事によると、これにはグリッド レイアウトが必要なようです。)
  2. テキスト ウィジェットのテキストのフォントやサイズを [設定] ダイアログで変更し、テキスト ウィジェットの周りに変な隙間を残さないようにします。(これにはパック レイアウトが必要なようです。テキスト ウィジェットにはピクセルではなく文字単位の幅と高さしか指定できないためです。つまり、フォントやサイズを変更するとテキスト ウィジェットが拡大または縮小し、ウィンドウが調整されません。 Font.measure を使用して、選択したフォントに応じて Text ウィジェットのサイズを調整しようとしましたが、正確なピクセルまでウィジェットのサイズを変更できないため、まだギャップが生じます。)
  3. 私の最終的な解決策は、クロスプラットフォーム (Windows と Linux の両方、できれば Mac) である必要があります。

要件を満たすには、どのレイアウトを使用できますか? どちらも完全に機能しない場合、どちらのレイアウト (グリッドまたはパック) が目標に最も近いでしょうか? ありがとう!

4

1 に答える 1

6

この単純なレイアウトではgridpackまたはその両方を使用できます。この特定のケースでは、どちらにも明らかな利点はありません。どちらも、必要なサイズ変更動作を備えています。

頭のてっぺんから、水平フレームを使用してボタンを保持し、ボタンをその中に詰め込みます. 次に、グリッドを使用して、ツールバー、テキスト ウィジェット、およびスクロールバーをフレーム内に配置します。パックも使用できますが、どちらでも機能します。それは右側の世話をします。

写真のようにメニューバーが必要な場合 (つまり、非標準、チェス盤の上のみ)、同様の手法を使用します: 上部にメニューバーが詰め込まれた左側の別のフレーム、下部にチェス盤。

次に、メイン ウィンドウで 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()
于 2011-01-24T22:25:48.277 に答える