width Frame

Frame
Frameとは
Frameはウィジェットの入れ物です。 ネットの記事ではTkinterはFrameありきで解説しているページがほとんどです。ということは「Frameを使わないとTkinterのプログラムはできない」となってしまいます。本当でしょうか?Frameを使わなくてもできます。
ウィジェットのサンプル例を振り返ってみましょう。

Labelを使って描画しています。ソースコードは以下のとおりです。

# -*- coding: utf-8 -*-
import tkinter as tk


def main():
    root = tk.Tk()
    root.title("Label sample")
    root.geometry("200x80")

    label1 = tk.Label(
        root,
         bg='yellow', relief=tk.RIDGE, bd=0,
        text='通信中です。')
    label1.place(x=23, y= 40)

    root.mainloop()

if __name__ == "__main__":
    main()

Frameを使っていません。しかし描画はできています。rootがLabelの入れ物になっています。

よくあるサンプルでは、rootとwedgetの間にFrameがあります。

これはどんなメリットがあるのでしょうか?よくわかるサンプルを作ってみました。

2つのFrameを使っています。

ソースを見ます。

# -*- coding: utf-8 -*-
import tkinter as tk

def main():
    root = tk.Tk()
    root.title("Frame App")
    root.geometry("400x300")

    frame1 = tk.Frame(root, width= 150, height=200,
        bg='#CCCCFF')
    frame1.place(x=23, y=45)
    label1 = tk.Label(
        frame1,
        text='通信中です。')
    label1.place(x=10, y= 10)


    frame2 = tk.Frame(root, width= 150, height=200,
        bg='#CCFFCC')
    frame2.place(x=200, y=45)
    label2 = tk.Label(
        frame2,
        text='データ計測中です。')
    label2.place(x=10, y= 10)


    root.mainloop()

if __name__ == "__main__":
    main()
label1,label2でplace(x=10, y= 10)と位置を指定しています。この位置はframe1,frame2の左上を原点とした位置です。よってframeの位置を変更してもlabelの位置は保たれます。rootで複数のウェジットを実装して、上に10ドット移動する場合すべてのウィジットの座標を変更することになります。Frameで配置してあればFrameの座標を変更するだけで済みます。

Frameのオプション

tk.Frame(,,,relief='xxxx')で枠の形状を指定します。
flat(枠なし)

groove

raised

ridge

solid

sunken