tkinterを使っていて最初につまずいたのがフレームのサイズについてだ。
フレーム内にWidgetを置こうとするとフレームのサイズが変わってしまう。
やりたいイメージ
こんな感じにフレーム内にラベルを配置したい。このときフレーム部分の大きさが変わらないようにしたい。
問題のプログラム
import tkinter as tk
class main(tk.Frame):
def __init__(self, master,cnf={}, **kw):
tk.Frame.__init__(self, master,cnf, **kw)
label1 = tk.LabelFrame(self,width=200,height=100,text="Label1",bg='yellow')
label2 = tk.LabelFrame(self,width=200,height=100,text="Label2",bg='blue')
label3 = tk.LabelFrame(self,width=200,height=100,text="Label3",bg='green')
label1.pack(side=tk.TOP)
label2.pack(side=tk.TOP)
label3.pack(side=tk.TOP)
root = tk.Tk()
frame = main(root,width=400,height=400,bg='red')
frame.pack()
frame.mainloop()
このプログラムを実行すると、
こんな感じにフレームの部分がなくなってしまう。
解決方法
propagateを設定
propagateは内部のWidgetに合わせてフレームサイズを変更するかどうかの設定。
デフォルトではTrueとなっていて、この場合内部のWidgetに合わせてサイズが変更される
このせいでframeのサイズが変わってしまっていた。
import tkinter as tk
class main(tk.Frame):
def __init__(self, master,cnf={}, **kw):
tk.Frame.__init__(self, master,cnf, **kw)
label1 = tk.LabelFrame(self,width=200,height=100,text="Label1",bg='yellow')
label2 = tk.LabelFrame(self,width=200,height=100,text="Label2",bg='blue')
label3 = tk.LabelFrame(self,width=200,height=100,text="Label3",bg='green')
label1.pack(side=tk.TOP)
label2.pack(side=tk.TOP)
label3.pack(side=tk.TOP)
root = tk.Tk()
frame = main(root,width=400,height=400,bg='red')
frame.propagate(False)
frame.pack()
frame.mainloop()
geometryでサイズを設定する
今までのプログラムではインスタンス生成時にサイズをwidth,heightの引数を渡して決めていた。(17行目)
これをgeometryで設定する。
import tkinter as tk
class main(tk.Frame):
def __init__(self, master,cnf={}, **kw):
tk.Frame.__init__(self, master,cnf, **kw)
label1 = tk.LabelFrame(self,width=200,height=100,text="Label1",bg='yellow')
label2 = tk.LabelFrame(self,width=200,height=100,text="Label2",bg='blue')
label3 = tk.LabelFrame(self,width=200,height=100,text="Label3",bg='green')
label1.pack(side=tk.TOP)
label2.pack(side=tk.TOP)
label3.pack(side=tk.TOP)
root = tk.Tk()
root.geometry('500x500')
root.configure(bg='red')
frame = main(root)
frame.pack()
frame.mainloop()
16行目にgeometryでサイズを設定している。
色の設定については以前のようにインスタンス生成時に引数で渡した設定が反映されなくなってしまったので17行目のようにrootに対して色を設定している。
なぜ色の設定が反映されなくなってしまったのかは不明。
結果
こんな感じにフレームのサイズを変えずにWidgetを置く事ができました。