5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Python + tkinter] LabelFrameウィジェットを使った入れ子構造

Last updated at Posted at 2018-07-31

初めての投稿です(そして最後になるかもしれない)
Python + tkinter でGUIアプリをコーディングしているときにハマりました。
参考書も読まず進めていて、おそらく超スーパー初歩な話なのですが、せっかくなので残しておこうと思います。

piture01.png

上図のように、LabelFrameを入れ子にして上1段、下2段にwidgetを配置したく、下記のようにすると、表示が崩れて困りました。
※記事ではフレーム名をウィンドウの見た目に示すためLabelFrameにしていますが、Frameでも同様です。編集リクエストをくださった方、ありがとうございました。

wrong.py
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

frame1 = ttk.LabelFrame(root,text="FRAME1").grid(row=0,column=0)

label1 = ttk.Label(frame1,text="text1").grid(row=0,column=0)

frame2 = ttk.LabelFrame(frame1).grid(row=1,column=0)
entry1 = ttk.Entry(frame2).grid(row=0,column=0)
button1 = ttk.Button(frame2, text="BUTTON1").grid(row=0,column=1)

root.mainloop()

piture02.png
こんなかんじ

いろいろ調べてなんとなく学習したのですが、入れ子にするfLabelFrameを、順番に閉じてやらないといけないようで、つまりそれぞれ内包するwidgetを配置したあとで、gridなりpackなりするんですね。
そうなっていないソースも散見されるのですが、特に入れ子にする場合は、自分の環境では(?)うまくいきませんでした。

correct.py
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

frame1 = ttk.LabelFrame(root,text="FRAME1")

label1 = ttk.Label(frame1,text="text1").grid(row=0,column=0)

frame2 = ttk.LabelFrame(frame1,text="FRAME2")
entry1 = ttk.Entry(frame2).grid(row=0,column=0)
button1 = ttk.Button(frame2, text="BUTTON1").grid(row=0,column=1)

frame2.grid(row=1,column=0)		#frame2を配置(綴じる)
frame1.grid(row=0,column=0)		#frame1を配置(綴じる)

root.mainloop()

私のようにスーパー初歩な方の参考になれば。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?