読者です 読者をやめる 読者になる 読者になる

猫野詩梨帳

ゴミの退学 ゴミの退職

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()

f:id:CyLomw:20161108153647j:plain


以降,次の箇所は基本的に省略する

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) を変更している

f:id:CyLomw:20161108125053j:plain


ちなみに cnf と kw で同じオプションを指定するとどうなるか?

cnf = {'background': 'white', 'padx': 10}
frame = tk.Frame(root, cnf, background = 'red')
frame.pack()

button = tk.Button(frame, text = 'Button1')
button.pack()

f:id:CyLomw:20161108130057j:plain

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()

f:id:CyLomw:20161108163917p:plain

これは bd = '10' のように文字列で指定することもできる

文字列で渡す場合,以下の単位を使うことができる

記号 単位
c センチメートル
i インチ
m ミリメートル
p ポイント(1/72 インチ)

例:

frame = tk.Frame(root, padx = '2c')

relief について

relief オプションでは縁(ボーダー)のスタイル指定ができる

当たり前だけどボーダー幅 (borderwidth) が 0 の場合は意味がない

指定できる値 どんな感じ
FLAT(デフォルト) 平ら(縁は見えず,スペースだけ)
SUNKEN フレームが押されたボタンのように沈む
RAISED フレームがボタンのように盛り上がる
GROOVE 縁が溝のように沈む
RIDGE 縁が尾根のように盛り上がる

f:id:CyLomw:20161108150808p:plain

上の図ではわかりやすいようにウィンドウ (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()

f:id:CyLomw:20161108151751p:plain


また,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()

f:id:CyLomw:20161108170708j:plain

上の例では内側の水平 (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()

f:id:CyLomw:20161108175019j:plain

空のフレームとパディング

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()

f:id:CyLomw:20161108155026j:plain


frame = tk.Frame(root, bd = 5,
    relief = tk.RIDGE, padx = 10, pady = 10)
frame.pack()

# こんどはフレーム外に設置
tk.Button(root, text = 'Button1').pack()

f:id:CyLomw:20161108153647j:plain


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()

f:id:CyLomw:20161108180018j:plain


空のフレームを用いてパディングしたい場合は propagation を False にして width, height を設定すればよい

もしくは,propagation が True(デフォルト)のままでも,pack や grid で配置する際にパディングを設定するとパディングされる(フレーム外のパディングのため)

tk.Frame(root).pack(pady = '1c')
tk.Button(root, text = 'Button1').pack()

f:id:CyLomw:20161108171239j:plain

上の例ではフレームを用いてボタンの上に 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 など配置方法について

次のページに詳しい

http://www.shido.info/py/tkinter2.html