Python.use(better) #Tutor: step03 -- def __call__(self, widget):

記事一覧 Python.use(better)《Python3.1》《復刻版》

def __call__(self, widget):

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

基礎編で利用した学習ツールを作成する過程を通して「プログラミング」の理解を深めます。
※ Tcl/Tk で作成した例題を、Python3.1 で再構成しました。

事例:モジュールを起動する

■ 全項目を確認する

全ステップの「項目」を確認するには、関数 do を利用します。

$ python -i tutorTk.py
>>> do()
...
3: step03 -- def __call__(self, widget):
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do に実引数を指定します。

>>> do(3)
>>> # -------------------------------------------------- step03

  • リスト領域(下部)では、任意の項目を選択できます。

任意の項目を選択(ダブルクリック)すると、

  • テキスト領域(上部)には、選択した項目が表示されます。

事例:コードの解説

def step03():
    """def __call__(self, widget):"""

    class Tutor(object):
        def __init__(self, master, target):
            self.help = self.create_help(master)    #@:
            self.create_controller(master, target)

        def __call__(self, widget):
            s,*_ = widget.curselection()
            s = self.items[int(s)]
            view = self.help
            view.delete(1.0, END)
            view.insert(END, "%s"%s)

        ## ----------------------------------------
        def create_help(self, master):
            frame = Frame(master)
            frame.pack()
            widget = Text(frame, bg="aliceblue", height=3)
            widget.pack()
            return widget                           #@:

        def create_controller(self, master, target):
            self.items = s = dir(target)

            frame = Frame(master)
            frame.pack(fill=BOTH, expand=True)

            widget = Listbox(frame, font="courier 12")
            widget.pack(fill=BOTH, expand=True)
            widget.bind(                            #1:
                "",
                lambda *args: self(widget),
                )

            for e in s:
                widget.insert(END, e)            

    ## ----------------------------------------
    def tips():
        root = Tk()
        root.title("builtins: %s"%target.__name__)
        root.geometry("200x150")
        Tutor(master=root, target=target)
        root.mainloop()
■ #1: 特殊メソッド __call__
        def __call__(self, widget):
            s,*_ = widget.curselection()
            s = self.items[int(s)]
            view = self.help
            view.delete(1.0, END)
            view.insert(END, "%s"%s)

特殊メソッド __call__ は、メソッド呼び出し () に呼応して、その動作を規定します。

  • メソッド curselection を利用して、選択した項目のオフセット値(文字列)が得られます。
  • メソッド delete を利用して、指定した範囲のテキストを削除します。
  • メソッド insert を利用して、指定した位置にテキストを挿入します。
■ #2: Listbox の動作を規定する
            widget = Listbox(frame, font="courier 12")
            ...
            widget.bind(                            #1:
                "",
                lambda *args: self(widget),
                )
  • メソッド bind を利用して、リスト widget を選択したときの動作を規定できます。

引数 "" に指定したイベントが発生すると、lambda 関数を起動します。すると、

  • ダブルクリックしたときに self(widget) が呼び出され、特殊メソッド __call__ に帰結します。

特殊メソッド __call__ では、実引数 widget を介して、Listbox を参照できます。


》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/05