2017-04-11 38 views
0

我在tkinter中的佈局有問題。這是我想要的 Layout這是什麼I have right now. 我不明白爲什麼會發生這種情況。我想,當我指定一個特定的框架的寬度和高度時,它會佔用所有這些地方,但這不會發生在self.GameStatFrame。如果有人能向我解釋爲什麼代碼會執行它的功能以及我的錯誤是什麼,那將會很好。Tkinter的佈局問題

下面是代碼:

class Application(tk.Frame): 
    def __init__(self, parent): 
     self.parent = parent 
     tk.Frame.__init__(self, parent) 
     #self.update_idletasks() 
     self.createWidgets() 

    def createWidgets(self): 

     #new frame for everything not in the canvas 
     #self.Frame = tk.Frame(self.parent) 
     self.MlGameStatFrame = tk.Frame(self.parent, width=600, height=300, 
     bg='blue') 
     self.GameStatFrame = tk.Frame(self.MlGameStatFrame, bg='white', 
     width=300, height=300) 
     self.MlFrame = tk.Frame(self.MlGameStatFrame, bg='white', 
     width=300, height=300) 


     #self.Frame.pack() 
     self.createGraphWidget() 
     self.MlGameStatFrame.pack() 
     self.GameStatFrame.pack(side=tk.LEFT, anchor=tk.W, fill=tk.BOTH) 
     self.MlFrame.pack(side=tk.BOTTOM, fill=tk.BOTH) 

     self.createGameStats(self.GameStatFrame) 
     self.createMlStats(self.MlFrame) 
     #self.createLog() 


    def createGraphWidget(self): 
     self.graph = tk.Canvas(self.parent, background ='white',    
     width=200,height=300) 
     self.graph.create_rectangle(0,20,40,50) 

     self.graph.pack(side=tk.TOP,fill=tk.X) 
# needs to get a frame because side by side with Ml stats 
    def createGameStats(self,GameFrame): 

     Frame1 = tk.Frame(GameFrame, bg='red', width=300) 
     tk.Label(Frame1, text="Status: ").pack(side=tk.LEFT, expand=tk.YES) 
     #initialize with certain value for now 
     self.statusChange = tk.Label(Frame1, 
     text="Learning").pack(side=tk.LEFT, expand=tk.YES) 

     Frame2=tk.Frame(GameFrame, bg='green') 

     tk.Label(Frame2, text="Fitness").pack(side=tk.LEFT, expand=tk.YES, 
     anchor=tk.W) #could get changed 
     self.fitnessChange = tk.Label(Frame2, text="6").pack(side=tk.LEFT, 
     expand=tk.YES) 

     Frame1.pack(side=tk.TOP, anchor=tk.W) 
     Frame2.pack(side=tk.TOP,fill=tk.X, anchor=tk.W) 


    def createMlStats(self, MlFrame): 
     Frame1 = tk.Frame(MlFrame) 
     tk.Label(Frame1, text="Status: ").pack(side=tk.LEFT, expand=tk.YES) 
    # initialize with certain value for now 
     self.statusChange = tk.Label(Frame1,  
     text="Learning").pack(side=tk.LEFT, fill=tk.X, expand=tk.YES) 

     Frame2=tk.Frame(MlFrame) 
     tk.Label(Frame2, text="Fitness").pack(expand=tk.YES, anchor=tk.W) 
     self.fitnessChange = tk.Label(Frame2, text="6").pack(side=tk.LEFT, 
     fill=tk.X, expand=tk.YES) 

     Frame1.pack(side=tk.TOP, fill=tk.BOTH,anchor=tk.W) 
     Frame2.pack(side=tk.TOP,fill=tk.BOTH) 

def main(): 
    root = tk.Tk() 

    root.geometry('600x900-0+0') #120* 50 ppixels in top right corner of desktop 
    app = Application(root) 

    app.master.title('Sample application') 

    app.mainloop() 

if __name__ == '__main__': 
    main() 
+0

代碼中的縮進不正確。 –

回答

0

的.grid佈局管理更加靈活:

class Application(Frame): 
    def __init__(self, parent): 
     self.parent = parent 
     Frame.__init__(self, parent) 
     self.create_widgets() 

    def create_widgets(self): 
     graph = Canvas(self.parent, width=200, height=300, bg="white") 
     graph.create_rectangle(0, 20, 40, 50) 

     mlgamestat_frame = Frame(self.parent, width=600, height=300, bg="blue") 
     gamestat_frame = Frame(mlgamestat_frame, width=300, height=300, bg="yellow") 
     ml_frame = Frame(mlgamestat_frame, width=300, height=300, bg="green") 

     graph.grid(row=0, column=0) 
     mlgamestat_frame.grid(row=1, column=0) 
     gamestat_frame.grid(row=0, column=0) 
     ml_frame.grid(row=0, column=1) 

,好像他們是在一個表中您可以將小部件。上面的代碼使您的預期佈局。

+2

我不會稱'grid'更靈活,只是靈活性不同。把東西放在網格中很好,而'pack'最適合從左到右和從上到下的佈局。你也犯了一個很常見的錯誤,那就是人們用'grid'做出的錯誤,因爲你忽略爲一行或多行和一列或多列指定一個非零權重。 –

+0

爲什麼你需要分配一個非零值的權重?是否可以將行或列拉伸以調整大小? – 7Orion7