2017-04-11 10 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'は左から右へ、上から下へのレイアウトに最適ですが、グリッドで物を敷くことは良いことです。あなたは、1つ以上の行と1つ以上の列にゼロ以外の重みを割り当てることを無視しているという点で、人々が 'grid 'で行う非常によくある間違いをしました。 –

+0

なぜ重みにゼロ以外の値を割り当てる必要がありますか?サイズ変更のために行または列を伸縮可能にするかどうかです。 – 7Orion7