Python.use(better, Tkinter=”GoF”) # Command #2

記事一覧 Python.use(better, Tkinter=”GoF")《Python3.1》

Command #2

《著》森こねこ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
α版♪1993/11/25 ● β版♪1995/11/22 ● 第1版♪2003/05/23

概要

Tkinter/Python によるオブジェクト指向プログラミングへの扉を開きます。
※ Tcl/Tk で作成した例題を、Python3.1 で再構成しました。

事例:コードの解説

■ Composite::Client
## ---------------------------------------- Composite::Client
class TIPS(object):     # Client, Aggregate

クラス TIPS では、Composite を利用するアプリケーションを規定します。

    def __init__(self, master, path):
        self.tree = Composite(path, self.tail(path))
        self.dirImage  = PhotoImage(file="_image/folder.gif")
        self.fileImage = PhotoImage(file="_image/file.gif")
        self.master = master
        self.path = path

メソッド __init__ では、さまざまなインスタンス属性を初期設定します。

    ## ----------------------------------------
    def createNode(self, master, tab, image, node):
        bg   = "aliceblue"
        font = "courier 12"
        side = LEFT

        frame = Frame(master)
        frame.config(bg=bg)
        frame.pack(anchor=W)
        Label(frame, text=tab      , font=font).pack(side=side)
        ButtonInvoker(frame, image, node      ).pack(side=side)
        Label(frame, text=node.item, font=font).pack(side=side)

Tkinterコンポーネント(Label/Button)を利用して、ツリーの各ノードを構築します。

■ Command::Invoker
## ---------------------------------------- Command::Invoker
class Invoker(object): pass

抽象クラス Invoker では、共通するプロトコルを規定します。

class ButtonInvoker(Invoker, Button):

クラス ButtonInvoker では、既存のコンポーネント Button を拡張するとともに、Invoker で規定されたプロトコルを実現します。

    def __init__(self, master, image, receiver):
        super().__init__(
            master=master,
            image=image,
            command=PanelCommand(receiver),
            )

クラス ButtonInvoker では、既存のコンポーネント Button を拡張するとともに、。

■ Command::Command
## ---------------------------------------- Command::Command
class Command(object):

抽象クラス Command では、共通するプロトコルを規定します。

    def __init__(self, receiver):
        self.receiver = receiver

メソッド __init__ では、さまざまなインスタンス属性を初期設定します。

  • インスタンス属性 self.receiver を介して、イベントに呼応する対象が実行時に確定します。
    def __call__(self): pass

これらの抽象メソッドは、共通するプロトコルを規定するもので、子孫クラスで具体的な処理を記述します。

■ Command::ConcreteCommand
## ---------------------------------------- Command::ConcreteCommand
class PanelCommand(Command):
    def __call__(self):
        self.receiver.createPanel()

メソッド __call__ は、演算子 () に呼応して、コンポーネントを操作したときの処理を規定します。

  • self.receiver に対して、パネルを作成 createPanel するように依頼します。

TOP


関連記事

Last updated♪2009/11/02