2012-05-12 1 views
2

私はTkinterを初めて使いました。希望のレイアウトを得るためにいくつか問題があります。ここにコードがあります: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 

Actual vs. expected result

は、私はそれを幅と高さを通過していても、メインフレームを構築するとき、私は pack()を呼び出すまで、その大きさはまだ 1x1であることに気づきました。私は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 
     # ... 

答えて

2

問題は、ツールパネルが間違った場所にあるということではなく、メインフレーム内にあり、メインフレームが間違っていることです。大体、それはそれのコンテナを中心に、トップに貼付される意味side=TOP, fill=NONE

mainframe.pack() 

... Tkinterのはデフォルトで、:

あなたがこれを行います。代わりに、メインフレームを左端に沿って配置するか、コンテナ全体に配置します。

次の二つのどちらかにその文を変更してみてくださいとGUIの起動時の挙動を観察し、そしてあなたは、サイズを変更する場合:追加の啓発のために

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

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