猫野詩梨帳

かわいいはかしこい

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

化学検定 (QMA)

QMA で化学検定が始まったのでさくっと SSS とってきました. いまのところ 3638 点で 129 位らしいです.初日なのに結構やってる人いますねえ.

内容はさほど難しくなくて物理・化学の予習☆5とかのほうがよっぽどきついです. あと元素問題が非常に多いので周期表覚えていけば S くらい取れると思います.

今作では予習では正答がわかるのですが,それ以外では表示されないので検定でも間違えた問題の正答がわかりません. ノートとるなり録画するなりして正答確認するしかないのが面倒くさいですね.

SSS でゲットできる通り名が面白いので是非挑戦してみてください.

ブログのデザインを変えました

アロエちゃんだよ〜

今日はお便りが来てるよ! 「QMA の物理・化学を極めるためにアトキンス物理化学なる本を買ったのですが,一向に正答率が上がりません」

・お答え アトキンス物理化学は物理化学の本であって物理・化学の本じゃないよ〜

アロエちゃんでした〜

クイズのゲーム

クイズのゲーム難しすぎ!!!!

QMA には組というものがあって上位をとっていると上の組に,下位をとっていると下の組に移る仕組みであり,これによってだいたい同じレベルの人たちと対戦できる.だいたい上から二番目のフェニックス組にいるのだが時間帯によってはまったく人がいない (com ばかり) のですぐ最上位のドラゴン組に上がってしまう.しかしドラゴン組は最上位の組だけあって強すぎて三連続コンビニ(ビリ決定戦)送りなどざらである.もっとフェニ組増えるか俺がドラゴン組に耐えられるようになれ!!!!

最近は物理化学を投げまくってます.

アロエちゃん

退学は暇なのでゲームセンターにいく.

QMAクイズマジックアカデミー)のアロエちゃんがかわいい.QMA アロエちゃん で画像検索するとよい.

アロエちゃんは両親が医者 / 看護師で,病院の手伝いをするために賢者を目指している.偉すぎる.退学は筐体に親の金をつぎ込んで賢者(Q レベル 50)になった.ゴミの人間.アロエちゃんは僕の娘です.

クイズはスポーツと芸能問題が全くと言っていいほど解けない.フェニックス付近にいるので見かけたらよろしくお願いします(くろむ@アロエ).