2017-07-27 15 views
0

Guiクラスを初期化してからラベルとボタンウィジェットをpack()すると、ブレークに存在するフレームが設定された素敵なフレームのデザインが完成しました。ボタンとラベルウィジェットのパックをコメントアウトして、それを見たいものにしているのはなぜですか?フレームのパッキングtkinterウィジェットがフレームを壊す

class Gui(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 

     self.parent.wm_title("Conflict found") 
     self.TV = 'Hello' 
     # Creation 
     self.statusbar = statusbar(self, bg="black", height=100, width=300) 
     self.main = Main(self, bg="grey", height=50, width=300) 

     # Packing 
     self.statusbar.pack(side="top", expand=True) 
     self.statusbar.label.pack() 
     self.main.pack(side="bottom", expand=True) 
     self.main.button.pack() 

    def quit(self): 
     self.parent.destroy() 


class Main(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     self.button = tk.Button(self, text="Exit", command=self.quit) 


class statusbar(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     self.label = tk.Label(self, text=self.parent.TV, fg='white') 

答えて

2

これは、tkinterが動作するように設計されていることです。 packまたはgridを使用すると、tkinterは子ウィンドウに合わせて親ウィンドウを拡大または縮小します。

これは、文字サイズ(画像などの重要なピクセル)に基づいてウィジェットのサイズに焦点を当てることができるため、GUIが適切なサイズになるため、99.999% 。

フレームやウィンドウ用の特定のサイズを選択すると、ユーザーが異なるフォントや別のOS、解像度の異なるモニター、またはユーザーが拡大または縮小しようとするとプログラムが正しく表示されません手動でウィンドウを開きます。

この現象を回避する方法はありますが、この動作をオフにすることはほとんどありません。最善の解決策は、インテリアウィジェットに焦点を当てて、ウィンドウサイズについてtkinterが気にすることです。

「100ピクセル高さと300ピクセル幅のステータスバーが必要です」と考えるのではなく、「少なくとも20文字分のスペースがあり、ウィンドウを水平に塗りつぶすステータスバーが必要です。 Tkinterは、あなたが使っているフォント、解像度、OSに関係なく、適切な処理を行います。

+0

ありがとう、ありがとう! – Hau5ratz

1

height=width=フレームが空の場合は正常にのみ適用されます。任意の子ウィジェットを追加すると、そのサイズはすべての子を保持するのに必要な最小値になるように再計算されます。これを避けるには、フレームに.pack_propagate(0)と電話するか(子供に.grid()を使用している場合は.grid_propagate(0))電話をかけることができます。

関連する問題