2012-05-12 97 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() 

下面是預期佈局(右)和實際佈局(左)。如果我使用工具面板的主人而不是主框架,那麼我會得到預期的輸出。但這不是我想要的,我認爲讓主框架成爲工具面板的主人更合理。

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

Actual vs. expected 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 
     # ... 

回答

2

的問題不在於toolpanel是在錯誤的地方,那就是它是主機內部和主機是在錯誤的地點。

當你這樣做:

mainframe.pack() 

... Tkinter的默認爲side=TOP, fill=NONE,大致意思就是將集中在它的容器中,並粘在上面。相反,您希望主機沿着左邊緣,或者填充整個容器。

嘗試改變該語句以下兩種,且當GUI開始觀察它的動作,當你調整:

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

對於額外的啓發,臨時更改主機的背景,然後嘗試上述兩個示例都可以查看哪些更改。當出現佈局問題時,這是一種強大的技術,因爲它可以幫助您可視化小部件是否填充了您認爲應該填充的區域