2017-09-14 73 views
0

大きなグリッド構造のフレームの内側にグリッドを設定しようとしています。私は問題の最も簡単なバージョンにそれを蒸留しようとしました。tkinterとpythonのグリッドとフレームのネスト

from tkinter import Tk, Frame, Label, Entry 

root = Tk() 
root.geometry('800x800') 


frame1 = Frame(root, width=400, height=400, background="Blue") 
frame2 = Frame(root, width=400, height=400, background="Red") 

frame1.grid(row=0, column=0) 
frame2.grid(row=1, column=1) 

label1 = Label(frame1,text='Label1') 
label1.grid() 

代わりにフレーム1の内側にラベルを配置する、ラベルはグリッド全体にフレームを置き換えます。

Sample output

私は他の例で見てきたが、私はできませんでした彼らがなぜ働いているのか特定することはできません。

答えて

2

フレームのwidth=およびheight=は通常、子がない場合にのみ適用されます。子ウィジェットが追加されると、子ウィジェットは内容に合わせてサイズ変更されます。だからframe1はまだそこにあります、ちょうどちょうどちょうどちょうどちょうどちょうどちょうどちょうど正確に同じサイズであり、ラベルによって完全に覆われています。

この自動サイズ変更の動作をオフにするには、フレームの.grid_propagate(0)(またはフレームの子に使用されているジオメトリマネージャによっては.pack_propagate(0))を呼び出します。

+0

ものの、ジオメトリ伝搬をオフにすることはほとんどない適切なソリューションではありません。これを使用すると、プログラマとして多くの作業をする必要があり、応答性の高いプログラムを作成する必要があり、解像度やフォントが異なるとうまく動作することを意味します。 –

+0

あなたのアプローチは何ですか? –

1

Frameが自動的にサイズ変更され、同様の質問がhereと掲載されているjasonharperの観察を使用して、コードを更新できました。私がコードに作ら

from tkinter import Tk, Frame, Label 

root = Tk() 
root.geometry('800x800') 

root.grid_rowconfigure(0, weight=1) 
root.grid_columnconfigure(0, weight=1) 
root.grid_rowconfigure(1, weight=1) 
root.grid_columnconfigure(1, weight=1) 

frame1 = Frame(root, background="Blue") 
frame2 = Frame(root, background="Red") 

frame1.grid(row=0, column=0, sticky="nsew") 
frame2.grid(row=1, column=1, sticky="nsew") 


label1 = Label(frame1,text='Label1') 
label1.grid() 

変更点は次のとおりです。

  • 彼らはとにかく何もしていなかったので、私はフレームインスタンスからの高さと幅のパラメータを削除しました。
  • フレームのコンテナであるrootの行と列に重みを付けて、空き領域にフレームを均等に配置します。
  • フレームのグリッド配置に 'sticky'パラメータを追加します。彼らが割り当てられたすべてのスペースをアップします。

結果:

New result

関連する問題