2017-10-23 14 views
0

私は挑戦できない何かを見つけ出しました。私は、次のフレームにあなたを送る2つのボタンを持って、彼らはうまく動作しますが、私はウィンドウのサイズを変更するときに、彼らは同じサイズを維持し、左上隅にと私は彼らが画面の中心にそれらを置くしたい。もしそれらが成長しているという例があれば、それはまた評価されるが必要ではない。また、可能であればグリッドをつけたいと思います。 私はcolumnconfigureを試して、フレームを別のフレームに配置しましたが、何も動作していないようです。不思議なことに、もし私がコンテナを自己に置き換えてボタンを押したままにすると、それはうまく動作しますが、誰かがこれを私に説明するか、私が間違っていることについての良い例を教えてくれますか?コードのウィンドウサイズに基づいてtkinterグリッドのサイズが変更されない

サンプル:

import tkinter as tk 
class MYapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     container = tk.Frame(self) 
     container.grid(row = 0,column = 0, sticky = "nsew") 
     container.rowconfigure(0, weight = 1) 
     container.columnconfigure(0, weight = 1) 
     container.columnconfigure(1, weight = 1) 
     self.frames = {} 
     for FRAME in (N1, N2): 
      frame = FRAME(container, self) 
      self.frames[FRAME] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 
     self.show_frame(N1) 
    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 
class N1(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     a.grid(row = 0, column = 0, sticky = "nsew") 
     c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     c.grid(row = 0, column = 1, sticky = "nsew") 
class N2(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     b = tk.Button(self, text = "N2") 
     b.grid(row = 0, column = 0, sticky = "nsew") 
if __name__ == "__main__": 
    app = MYapp() 
    app.mainloop() 

解決しよう:ブライアンへ 感謝。 これは、回答が更新された最新のコードです。

import tkinter as tk 
class MYapp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     container = tk.Frame(self) 
     container.pack(fill="both", expand=True) 
     container.rowconfigure(0, weight = 1) 
     container.columnconfigure(0, weight = 1) 
     self.frames = {} 
     for FRAME in (N1, N2): 
      frame = FRAME(container, self) 
      self.frames[FRAME] = frame 
      frame.grid(row = 0, column = 0, sticky = "nsew") 
      frame.rowconfigure(0, weight = 1) 
      frame.columnconfigure(0, weight = 1) 
      frame.columnconfigure(1, weight = 1) 
     self.show_frame(N1) 
    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 
class N1(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     a.grid(row = 0, column = 0, sticky = "nsew") 
     c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2)) 
     c.grid(row = 0, column = 1, sticky = "nsew") 
class N2(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     b = tk.Button(self, text = "N2") 
     b.grid(row = 0, column = 0, sticky = "nsew") 
if __name__ == "__main__": 
    app = MYapp() 
    app.mainloop() 
+0

あなたは同じサイズで、左上隅に留まっていると言いましたが、あなたがしたいことを述べなかったのです。彼らは中心に置かなければなりませんか?ウィンドウで成長しますか?トップに留まる?底に留まる?真ん中に余分なスペースを置く? –

+0

私の謝罪、私は私の質問を更新します。私はそれらを中心にしたかった。また成長する例も非常に役立つでしょう。 – kytexaranort

答えて

1

あなたは好きな振る舞いとは違って、あなたのやっていることは間違っているだけです。私はこの提案があなたが望むものをやるかどうかわからない。

gridを使用する場合は、管理対象のウィジェットを含む親に対して少なくとも1つの行と1つの列に重みを付ける必要があります。コンテナ内のウィジェットに対してはそうしますが、ルートウィンドウに対しては行いません。したがって、ウィジェットの中にのコンテナが正しくサイズ変更されている可能性がありますが、コンテナ自体のサイズが変更されていないため、コンテナが表示されません。

別のウィジェット内に1つのウィジェットを配置する場合は、1行のコードですべてを行うことができるので、packを使用することをおすすめします。

container.pack(fill="both", expand=True) 

また、あなたのコンテナは、単一の行と単一の列を持っているようだから、あなたはおそらく1列目に体重を与えたくない。そのため、私は、コンテナ自体のためにpackではなくgridを使用することをお勧めします。

最後に、gridを使用して各ページ(N1N2)内のウィジェットを管理していますが、これらのフレーム内の行または列に重みを付けることも忘れてしまいます。

+0

私が間違っていたことが分かったと思います。私はcontainer.gridを指定したパックラインに置き換えた後、frame.gridにウェイトを追加しました。ありがとうブライアン。 – kytexaranort

0

グリッド機能は、それらの位置を保持します。あなたはあなたを助けるかもしれないパック機能を使用することができます。それは、Tkinterが簡単に行えないものです。

関連する問題