猫野詩梨帳

ゴミの退学 ゴミの退職

プログラミングの入門記事みたいなのを書こうかな〜とかやっぱ書かなくていいかな〜とか考えてる話

せっかくプログラミングがちょっぴりできるのにとくに何か役立てているわけでもない(会社もやめちゃったし)のでプログラミングの入門記事みたいなのを書こうかな〜と思うことがある.

でもたぶんもっとプログラミングができる人が書いた方がいいとも思うし,実際そういう記事って探せば結構あると思う.

でも暇だしやっぱり書こうかな〜と思ったりする.

でもたぶん私のことなのでおそらく第一回目を書いたところで飽きてやめると思う.

でも第一回目だけでも書くとしたら何の言語について書くのがいいのかな〜と思って,Python とか Haskell とか (C とか……これはあんまり書きたくないけど),いろいろ候補があるけど,いっそ自分も全然できない言語の入門を書いてみるというのもあるのかなと思った.

いや普通に考えて初心者が初心者入門記事を書くのはまずいんだけど,嘘書いちゃったりするし,でもどうせ無職だし誰が自分の書いたのを見て間違えて覚えても関係ねーって感じで書いちゃおっかな〜と思うこともある.そういうことばっかり考えて生きるのはつかれるよ.

最近 Land of Lisp を 1/3 くらい読んだので Common Lisp ってのもアリかな〜と思う.というか,人のためというより自分が書けるようになりたい.

結局なにが言いたいのかというと,もし頭がおかしくなってそういう嘘だらけの入門みたいなのを書き始めて,しかも途中で放り投げてやめても許してねと言いたかっただけでした.

死ぬのが怖い

十月に就職した会社を一週間で辞め,現在無職である. 下宿も引き払い,実家に引き籠っている. 仕事もなく,最近は楽しいと思うことも少なく, ただ毎日生きるのが面倒だと思うばかりである. 生きている意味もなく(私はいわゆる生きる意味というものはそもそもないと考えているのだが),今すぐにでも死んだほうがいくらかましである. しかし,これだけ毎日つまらなく,死んだほうがいいと思っていても,死ねないのである.死ぬのは怖い.毎日,明日がこなければどんなにいいだろうと思いながら眠りについているにも関わらず,死ぬのは怖い.

ここから,私はある洞察を得た. 私は,死ぬことができない人間なのかもしれない.死なないようにできているのである.

そういえば,人間は簡単に死んでしまうものなのに,私は今まで生きてきて死にそうになったことがない.事実,死んでいない. 私が死ねない人間であるとすれば,これは当然のことである.

また,普段から疑問に思っていることがある.なぜ私にのみ自我があり,他のものには自我がないのか. 私の自我は,この世界で唯一説明がつかないことのように思える. つまり,私の自我はこの世界の法則を越えたところにある. 即ち,“私”はこの世界の一つ上の次元に存在しているのだ.私はこの世界の主人公(のひとり?)か,あるいは神(のひとり?)か,そういう存在なのである.世界を放棄して死ぬことは許されない.あるいは死なないように設定されている.自ら死に向かわないよう死を怖がるように設定されており,おそらく実際に自殺しようとしてもできないようになっているのであろう.

だから私は死ぬことができない.

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 の物理・化学を極めるためにアトキンス物理化学なる本を買ったのですが,一向に正答率が上がりません」

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

アロエちゃんでした〜