【Tkinter】Widget配置時のフレームサイズの変更

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を置く事ができました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA