作者: 機械伯爵
日時: 2005/12/20(20:05)
 ログでは月曜日に登録されていますが、最後の最後で
時間オーバーしてしまいました(まぎらわしいのでタイ
ムスタンプを変更して月曜日にアップされたことにして
いますが、20分ほどオーバーしています)。
 何はともあれ、終了しました。
 読んでくださった皆さん、さらに修正やら突っ込みや
ら入れてくれた皆さんに感謝です。
 これから、全編読み直して手を加えた上で、一括ダウ
ンロードできるようにファイル (TXT + PDF) を作る予定
です。
 しかし、週一回、十週連続なんて、無茶だとゆーこと
がよくわかりました。
 今後も突発的に連載とかするかもしれませんが、一ヶ
月、4〜5回が限度ですね(それも予め、半分くらい書
いておいて)
 ともかく初の試みですが、楽しんでいただけたら幸い
です。



<翔子のノート>
        Tkinterモジュール
                GUI を扱うモジュールで、Win 版 Python
                には添付(Mac OS X 10.4 Tiger には
                標準装備)。
                基本的に from〜 import * 構文で一
                括インポートするように作られている。
        ウィジェット
                GUI部品のこと
                w = Widget(master, option_name = option ...)
                の形式で作成する。
        オプション
                ウィジェットの持つ属性のこと。文字
                やイメージ、前景/背景などのパラメー
                タなど。
        packメソッド
                ウィジェットを組み込むメソッドの一
                つ。ウィジェットに共通。
        mainloopメソッド
                Tkアプリケーションを起動状態に保つメソッド。
                スクリプトの最後に、Tk オブジェクト
                (トップレベルオブジェクト)に対し
                て実行する。
        destroyメソッド
                ウィジェットを破壊する。トップレベ
                ルを破壊すると、アプリケーションが
                終了する。
        textオプション
                Label などに表示するテキスト。ASCII
                あるいは UTF-8 の文字列で指定する。
        imageオプション
                Label などに表示するイメージ。
                BitmapImage や PhotoImage などのイ
                メージオブジェクトで指定。
        fgオプション
                前景色。文字色や BitmapImage の色な
                どを指定。色名や RGB 文字列 ('#RRGGBB
                ') で指定
        bgオプション
                背景色。指定方法はfgと同じ。
        Labelウィジェット
                テキストやイメージを表示するための
                簡単な部品。
        Buttonウィジェット
                ボタン部品。ボタンを押すと、command
                オプションに指定されたコマンドを実
                行する
        commandオプション
                Button ウィジェットに『引数の無い』
                関数あるいはメソッドを指定する
        Entryウィジェット
                簡易文字入力用部品。文字の入力、編
                集が可能。
        Entry.getメソッド
                Entry ウィジェットに書かれている文
                字列を取得
                txt = e.get()
        Entry.deleteメソッド
                Entry ウィジェットに書かれている文
                字を、範囲指定して消去。
                全消去ならe.delete(0,END)
        Entry.insert
                Entry ウィジェットに書かれている文
                字列に文字列を挿入。
                追加ならe.insert(END,string)
        bindメソッド
                マウスイベントやキーイベントに、ウ
                ィジェットを関連づける。
                command と異なり、イベント内容を受
                け取る引数1つを必ず持つ関数やメソ
                ッドのみが指定可能。
        イヌのしつけ方
                厳しさとともに、スキンシップが重要





<巽の薀蓄>

・Tkinter
 GUI ツールキット Tk を、Python から使うためのモジ
ュール。Tk は、本来コマンド拡張言語という、ちょっと
変わったプログラミング言語として有名な Tcl 言語に付
属のツールキットで、Tcl/Tk として知られている。
Tkinter は、もともと個人用業務に使うための Tcl/Tk
のラッパー(Python から Tcl コマンドを呼び出して使
う)として作られたためか、Tcl 言語の書き方のクセが
強く、Python だけを勉強していても若干判りにくいとこ
ろがある。なお、本来は Python スクリプトを翻訳して
Tcl に渡されていたが、現在では Tk に直接渡されてい
る。しかし Tcl が無視されたわけではなく、逆に、Tcl
クラスなる、Tcl インタープリタを起動させるためのイ
ンターフェイスも 2.4 で新設された。

・配置ツール『ジオメトリマネージャ』
 ウィジェット部品を配置するために、Tk では『ジオメ
トリマネージャ (Geometory Manager)』というものを用
いるが、pack メソッドはその中の一つ、Packer(Pack
Geometory Manager) に、ウィジェットを委ねるメソッド
である。Packer は何も考えずに放り込むには簡単だが、
思ったとおりに配置するのは結構難しかったりする。他
にも、Gridder や Placer といったジオメトリマネージ
ャがある。

・トップレベルオブジェクト
 Tk クラスのオブジェクトとして作られるのは、トップ
レベルと呼ばれるウィジェットで、要するにウィンドウ
アプリケーションそのものである。実は今回の全てのア
プリケーションでは、ウィンドウは一つなので、明示的
にトップレベルを作る必要は本来無い。その場合、
mainloop はメソッドではなく、関数として起動すれば良
くなる。以下に、最初のプログラムの手抜きバージョン
を参考までに掲載する。

# coding: sjis
from Tkinter import *

def s2u(s):
  return unicode(s, 'sjis').encode('utf-8')

l = Label(
  text = s2u('唯我独尊'),
  font = 'herbetica 72 bold'
)
l.pack()

Button(
  text = s2u('意訳'),
  font = 'times 36 italic',
  command = lambda : l.config(
    text = s2u('じこちゅー!'),
    fg = 'red',
    bg = '#0000FF')
).pack()
mainloop()

・オブジェクト指向のTkinterプログラミング
 逆に、オブジェクト指向を前面に出してプログラムを
書く場合、最初のプログラムは以下のように書くべきだ
と言われる。

# coding: sjis
from Tkinter import *

def s2u(s):
  return unicode(s, 'sjis').encode('utf-8')

class YuigaDokuson(Frame):
  def __init__(self, master):
    Frame.__init__(self, master)
    self.label = Label(
      self,
      text = s2u('唯我独尊'),
      font = 'herbetica 72 bold'
    )
    self.pack()
    self.button = Button(
      self,
      text = s2u('意訳'),
      font = 'times 36 italic',
      command = self.changeLabel
    )
    self.label.pack()
    self.button.pack()
  def changeLabel(self):
    self.label.config(
      text =  s2u('じこちゅー!'),
      fg = 'red',
      bg = '#0000FF'
    )

w = Tk()
f = YuigaDokuson(w)
w.mainloop()

 なお、Frame クラスは単なるコンテナだと思って欲し
い。
 少し規模の大きなプログラムでは、面倒でもこのよう
な書き方で書くべきだろう。
 ただし、全てこのフォーマットで書くべきかどうかは、
意見の分かれるところであろう。