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
|