2

私はTkinterを初めて使用しますが、目的のレイアウトを取得するのに問題があります。コードは次のとおりです。

import tkinter as tk

class MainFrame(tk.Frame):
    def __init__(self, master, w, h):
        tk.Frame.__init__(self, master, width=w, height=h)
        self.toolpanel = ToolPanel(self, 200, h)
        self.toolpanel.pack(side=tk.LEFT, fill=tk.Y)

class ToolPanel(tk.Frame):
    def __init__(self, master, w, h):
        tk.Frame.__init__(self, master, width=w, height=h, background='#000')

def main():
    root = tk.Tk()
    root.geometry('640x480')

    mainframe = MainFrame(root, 640, 480)
    mainframe.pack()

    root.mainloop()

以下は、予想されるレイアウト(右)と実際のレイアウト(左)です。rootメインフレームの代わりにツールパネルのマスターを作成すると、期待どおりの出力が得られます。しかし、これは私が望んでいることではありません。メインフレームをツールパネルのマスターにする方が理にかなっていると思います。

self.toolpanel = ToolPanel(self, 200, h)   # Actual result
self.toolpanel = ToolPanel(master, 200, h) # Expected (desired) result

実際の結果と期待される結果

1x1メインフレームを作成するときに、幅と高さを渡しても、呼び出すまでそのサイズが残っていることに気付きましたpack()。Tkinterアプリケーションをより適切に整理するにはどうすればよいですか?また、どのようにして目的の結果を得ることができますか?

class MainFrame(tk.Frame):
    def __init__(self, master, w, h):
        tk.Frame.__init__(self, master, width=w, height=h)

        # At this point, the size is still 1x1
        # ...
4

1 に答える 1

2

問題は、ツールパネルが間違った場所にあることではなく、メインフレームの内側にあり、メインフレームが間違った場所にあることです。

これを行うとき:

mainframe.pack()

... Tkinterのデフォルトは、です。side=TOP, fill=NONEこれは、大まかに言って、コンテナの中央に配置され、上部に固定されることを意味します。代わりに、メインフレームを左端に沿って配置するか、コンテナー全体を埋める必要があります。

そのステートメントを次の2つのいずれかに変更して、GUIの起動時とサイズ変更時の動作を観察してください。

mainframe.pack(fill="both", expand=True)
-or-
mainframe.pack(side="left", fill="y")

さらに啓蒙するために、メインフレームの背景を一時的に変更してから、上記の両方の例を試して、何が変わるかを確認してください。レイアウトの問題がある場合、これはウィジェットが必要と思われる領域を埋めているかどうかを視覚化するのに役立つため、強力な手法です。

于 2012-05-12T12:01:04.807 に答える