Python 弾丸ツアー #DP: ツリー ... step 3: Tkinter:コンポーネント

OOPデザインパターンリファクタリング

Python.use(better); Python 弾丸ツアー #DP: Tkinter/Python
>>> ツリー(階層構造)
step 3: Tkinterコンポーネント
《Python3.1|Jython2.5|IronPython2.6》

《著》小粒ちゃん@湘南組《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/23 ● 第4版♪2010/03/08

step 3: コードの解説

《TIPS》Tkinterコンポーネント

● Entry
 ̄エントリー Entry は、任意のテキスト(文字列)を入力したいときに便利です。クラス呼び出し Entry() において、キーワード引数 master= に続いて、その部品を配置する親を指定します。

        w = Entry(master=frame, width=10)

ここでは、フレーム frame を親に指定したので、生成したエントリーは(ウィンドウではなく)フレーム内に配置されます。さらに、キーワード引数 width= に続いて、入力したいテキスト(文字列)の幅を指定します。ここでは、10文字を入力できる幅が確保されます。□

■ Composite::Leaf:単体オブジェクト
## ---------------------------------------- Composite::Leaf
class Leaf(Component):

    ## ---------------------------------------- Iterator::ConcreteIterator
    def __iter__(self): return self

    def __repr__(self): return "#%r"%self.item

    def __str__(self): return "%s"%self.item

    def items(self): return [self.item]

    def indents(self, level): return [level]

    def dirs(self): return [False]

    def nodes(self): return [self]

 ̄新たに追加したメソッド items では、各ノードが保持する項目 self.item を列挙したリストをリターン値にします。これは、変更する前のメソッド nodes と同じものです。また、変更したメソッド nodes では、単体オブジェクトである自身 self を要素とするリストをリターン値にします。□

■ Composite::Composite:複合オブジェクト
## ---------------------------------------- Composite::Composite
class Composite(Component):
    def __init__(self, path, item):
        super().__init__(path, item)
        self.children = []

    ## ---------------------------------------- Iterator::ConcreteIterator
    def __iter__(self):
        for e in self.children:
            yield e

    def __repr__(self):
        return "%s(#%s: [%s])"%(
            self.__class__.__name__,
            self.item,
            ",".join([repr(e) for e in self]),
            )

    def __str__(self):
        return "\n".join([self.item]+[str(e) for e in self])

    def items(self):
        return reduce(lambda s,e: s+e.items(),
            self, [self.item])

    def indents(self, level=0):
        return reduce(lambda s,e: s+e.indents(level+1),
            self, [level])

    def dirs(self):
        return reduce(lambda s,e: s+e.dirs(),
            self, [True])

    def nodes(self):
        return reduce(lambda s,e: s+e.nodes(),
            self, [self])

    def add_(self, component):
        self.children.append(component)

 ̄新たに追加したメソッド items では、各ノードが保持する項目 self.item を列挙したリストをリターン値にします。これは、変更する前のメソッド nodes と同じものです。また、変更したメソッド nodes では、複合オブジェクトである自身 self を要素とするリストをリターン値にします。□

《Point》実際の開発では、目論見が外れて後戻りを余儀なくされる場面が少なくありません。仕様変更と同様に、痛手を追って回復するまでの「プログラミングの効率」についても配慮する必要があります。この step3 で、メソッドの付け替え(items および nodes)を意図的に取り上げたのは、このような背景を踏まえたものです。□

TOP
》作業中です《