tkinter.Frame
最近 tkinter を使っているのでせっかくなのでメモを残す
注意
python3
正確な情報はもっと信頼できるところから得て下さい
Frame(フレーム)とは
中に他のウィジェットを入れることができる
ウィジェットをグループ化してきれいに配置したりできる
基本的な使い方
import tkinter as tk root = tk.Tk() frame = tk.Frame(root) frame.pack() # 中にボタンを入れてみる button = tk.Button(frame, text = 'Button1') button.pack() root.mainloop()
以降,次の箇所は基本的に省略する
import tkinter as tk root = tk.Tk() # ここに処理 root.mainloop()
コンストラクタ (__init__
)
__init__(self, master = None, cnf = {}, **kw)
master: 親ウィジェット
cnf, kw: オプション(後述)
cnf は辞書 (dict) を,kw はキーワード引数をとるらしい
例:
cnf = {'background': 'white', 'padx': 10} frame = tk.Frame(root, cnf, borderwidth = 10, relief = tk.RIDGE) frame.pack() button = tk.Button(frame, text = 'Button1') button.pack()
上の例では背景を白,横方向のパディング,外枠の幅とその見た目 (relief) を変更している
ちなみに cnf と kw で同じオプションを指定するとどうなるか?
cnf = {'background': 'white', 'padx': 10} frame = tk.Frame(root, cnf, background = 'red') frame.pack() button = tk.Button(frame, text = 'Button1') button.pack()
kw で設定した値になった
基本オプション
よく使うオプション
色や幅に指定できる値については後述
オプション | 説明 | デフォルト値 |
---|---|---|
background | 背景色 | |
bg | background に同じ | |
borderwidth | 縁(ボーダー)の幅 | 0(縁無し) |
bd | borderwidth に同じ | 〃 |
relief | 縁のスタイル(後述) | FLAT |
padx | 水平方向パディング | 0 |
pady | 垂直方向パディング | 0 |
width | 水平方向長さ(ただし propagation の設定が必要:後述) | 0 |
height | 垂直方向長さ(ただし propagation の設定が必要:後述) | 0 |
オプションは __init__
で設定する以外に後から設定することも可能
オプションの設定方法はなぜか複数あるので好きなものを使う
frame['bg'] = 'blue' frame.config(bg = 'green') frame.configure(bg = 'yellow') # config, configure は辞書指定も可能 cnf = {'bg': 'black'} frame.config(cnf, padx = 100)
ちなみに frame.bg = 'blue'
とかはダメなので注意
オプションの取得方法も複数ある
print(frame['bg']) print(frame.cget('bg'))
オプションの設定とかは基本的に他のウィジェットでも同じ
色について
background などへの色指定には 2 つの方法がある
方法 1. 16進トリプレット表記
16進トリプレット表記が使用できる (#FFFFFF みたいなやつ)
3 桁,6 桁,9 桁で表記できる
# rgb (12 ビットカラー: 4096 色) frame.config(bg = '#0f0') # rrggbb (24 ビットカラー: 16777216 色) frame.config(bg = '#ff6347') # rrrgggbbb (36 ビットカラー: 68719476736 色) frame.config(bg = '#e0f1aa35c')
方法 2. 定義されている名前を使う
white, black, red, green, blue, cyan, yellow, magenta などの名前で指定することができる
これ以外にもあるみたいだけど少なくとも上にあげた 8 色については環境依存なしに使用できるみたい?
# マゼンタ frame.config(bg = 'magenta')
単位について
borderwidth, padx, pady などに設定する値はピクセル単位である
frame = tk.Frame(root, bd = 10) frame.pack() button = tk.Button(frame, text = 'Button1') button.pack()
これは bd = '10'
のように文字列で指定することもできる
文字列で渡す場合,以下の単位を使うことができる
記号 | 単位 |
---|---|
c | センチメートル |
i | インチ |
m | ミリメートル |
p | ポイント(1/72 インチ) |
例:
frame = tk.Frame(root, padx = '2c')
relief について
relief オプションでは縁(ボーダー)のスタイル指定ができる
当たり前だけどボーダー幅 (borderwidth) が 0 の場合は意味がない
指定できる値 | どんな感じ |
---|---|
FLAT(デフォルト) | 平ら(縁は見えず,スペースだけ) |
SUNKEN | フレームが押されたボタンのように沈む |
RAISED | フレームがボタンのように盛り上がる |
GROOVE | 縁が溝のように沈む |
RIDGE | 縁が尾根のように盛り上がる |
上の図ではわかりやすいようにウィンドウ (root) の背景色を黒,フレームの背景色を白にしている (borderwidth は 5)
この他に SOLID とかもあるみたいだけど環境依存?
例:relief を RIDGE に設定する
いま import tkinter as tk
とインポートしているので tk.RIDGE
と書く必要があることに注意する
import tkinter as tk root = tk.Tk() frame = tk.Frame(root, bd = 5, relief = tk.RIDGE) frame.pack() # 中にラベルを入れる label = tk.Label(frame, text = 'RIDGE BORDER') label.pack() root.mainloop()
また,relief の値は文字列でも指定できる
この場合は flat, sunken, raised, groove, ridge と小文字で指定する
例:
frame = tk.Frame(root, bd = 5, relief = 'ridge')
padx, pady について
フレームは中に配置したウィジェットにぴったりくっつく
パディングを設けたいときは padx, pady オプションを使用すればよいが,これは「内側の」パディングである
外側にパディングを設けたい場合は pack, grid の padx, pady オプションを使用する
import tkinter as tk root = tk.Tk() # ウィンドウの背景色を黒に設定 root.config(bg = 'black') # フレームの背景色は白 frame = tk.Frame(root, bd = 5, relief = tk.RIDGE, bg = 'white', padx = 10) frame.pack(pady = 10) # フレーム内に配置するラベルの背景色は赤 tk.Label(frame, text = 'Label1', bg = 'red').pack() root.mainloop()
上の例では内側の水平 (x) 方向と外側の垂直 (y) 方向にパディングを設けている
propagation と width, height
フレームは中に配置したウィジェットにぴったりくっつくため,フレームの大きさは中のウィジェットの大きさによって決まる
中に配置したウィジェットに関係なくフレームの大きさを制御したい場合は,propagate メソッドを用いて propagation(伝播)の設定を変更する
フレームの propagation
propagation | 意味 |
---|---|
True(デフォルト) | 中のウィジェットにくっつく |
False | 中のウィジェットにくっつかない |
propagation を False にすると,フレームの大きさは width, height オプションで指定した値になる(True の場合これらの値は無視される)
例:
frame = tk.Frame(root, bg = 'blue', width = '3c', height = '2c') frame.propagate(False) frame.pack() button = tk.Button(frame, text = 'Button') button.pack()
空のフレームとパディング
propagation が True(デフォルト)の場合,中に何も配置されていないフレームは大きさが 0 のためか borderwidth や padx, pady を設定しても何も表示されない
例:
frame = tk.Frame(root, bd = 5, relief = tk.RIDGE, padx = 10, pady = 10) frame.pack() # ボタンをフレーム内に設置 tk.Button(frame, text = 'Button1').pack()
frame = tk.Frame(root, bd = 5, relief = tk.RIDGE, padx = 10, pady = 10) frame.pack() # こんどはフレーム外に設置 tk.Button(root, text = 'Button1').pack()
propagation を False にし width, height を設定するとボーダーは表示されるが,padx, pady は機能しない
frame = tk.Frame(root, bd = 5, relief = tk.RIDGE, padx = '10c', pady = '10c', width = '1c', height = '1c') frame.propagate(False) frame.pack()
空のフレームを用いてパディングしたい場合は propagation を False にして width, height を設定すればよい
もしくは,propagation が True(デフォルト)のままでも,pack や grid で配置する際にパディングを設定するとパディングされる(フレーム外のパディングのため)
tk.Frame(root).pack(pady = '1c') tk.Button(root, text = 'Button1').pack()
上の例ではフレームを用いてボタンの上に 1 cm * 2 = 2 cm のパディングを設けている
その他のオプション
オプション | 説明 | デフォルト値 |
---|---|---|
class | ||
colormap | ||
container | ||
cursor | ||
highlightcolor | ||
highlightbackground | ||
highlightthickness | ||
takefocus | ||
visual |
次のページに詳しい
http://effbot.org/tkinterbook/frame.htm
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/frame.html
メソッド
Frame には固有のメソッドはない(たぶん)のでウィジェット共通のメソッドのみ(親クラスの Misc
とか BaseWidget
とかで定義されている)
次のページに詳しい
http://epydoc.sourceforge.net/stdlib/Tkinter.Frame-class.html
pack, grid, place など配置方法について
次のページに詳しい