2009年05月06日

GUIは気軽に

 Pythonには付属でTkの使えるtkinterライブラリがついてくるのは周知の通り。
 だが、入門サイトとかを見ると、やたらとクラスを使ってコーディングする方法が目に付く。
 クラスはGUIに、本当に必須なのか?
 面倒なクラス設定無しに組むのは「ダメな」やり方なのだろうか?

 私の意見を言わせてもらえば、簡単なモノには、クラス定義は全く不要だと思う。
 勿論、私が以前書いた『背景付スタック電卓』みたいに、やや長いコードを書くならともかく、書き捨ての簡単なGUIプログラムをクラスでラッピングしても見づらくなるだけだ。
 特に「同僚や友達に使ってもらおうと思うけど、コマンドラインはちょっと」程度のプログラム、つまりちょっとしたフロントエンドが欲しい時などは、迷わずに数行の非クラス型プログラムを組むべきだろう。
 もし、再利用や拡張の機会があれば、その時に書き直しても遅く無い。
 以下は、一般的によく使うウィジェットで組んだ簡単な例だ。
# テキスト追加プログラム
# Entryに文字を入れてEnterすると、下のラベルに追加される
# 日本語が混じっているので、例によってUTF-8で保存

# 書き換え用関数
def addText(event):
  l1['text'] = l1['text']+'\n' + e.get()
  e.delete(0,END)

# Pyton 3では、'Tkinter'ではなく'tkinter'
from tkinter import *

w = Tk()
l0 = Label(w, text='ここに入力')
e = Entry(w)

# EntryオブジェクトにEnterキーの動作をバインド
e.bind("<Return>",addText)

l1 = Label(w, text='ここに出力されます')
b = Button(w, text='終了', command=w.destroy)

for x in l0,e,l1,b:
  x.pack()

# Entryにフォーカスを合わせる
e.focus_set()

w.mainloop()
 入出力だけなら、トップレベル(Tk)、ラベル、ボタン、一行入力(Entry)くらいで話は済んでしまう。
 ポイントは、ラベルの書き換えと、バインド(キーの動作によって起動するコマンドを設定する)の書き方と、フォーカス(カーソルの強制移動)くらいだ。
 特にバインドやフォーカスは、コマンドラインプログラムに無い密かな楽しみ……つまり「キーの動作をコントロールできる」という楽しみにつながるのだが、なぜか「簡易入門」は、ボタンクリック駆動式ばかりが目立つ。
 おっと、Windowsユーザは、拡張子を.pywにしておけば、スクリプトファイルクリック一発起動だ(コンソールは開かない)。
 まぁ、最初のうちはよく失敗するだろうが、大して難しく無いので、ルーキーPythonistaは是非トライして欲しい。

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/kikwai/51598070