Python.use(better, Tkinter=”GoF”) # Iterator #3

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

Iterator #3

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

概要

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

事例:コードの解説

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

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

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

    def tail(self, path):
        return path.split("/")[-1]

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

    ## ----------------------------------------
    def makeTree(self):
        tab        = "    "
        tab_folder = "  + "
        tab_file   = "  . "

        T = self.tree
        for indent, dir, node in zip(
            T.indents(), T.dirs(), T.nodes()
        ):
            self.createNode(
                master=self.master,
                tab=tab*indent+(tab_file, tab_folder)[dir],
                text=self.tail(node),
                image=(self.fileImage, self.dirImage)[dir],
                )

メソッド makeTree は、ディレクトリーの傘下にある階層構造をもとに、ツリー self.tree を生成します。

    def createNodes(self):
        self._createNodes(self.tree, self.path)

    def _createNodes(self, parent, path, indent=0):
        for e in listdir(path):
            current = join(path, e)
            if isdir(current):
                component = Composite(e)
                parent.add_(component)
                self._createNodes(component, current, indent+1)
            else:
                component = Leaf(e)
                parent.add_(component)
  • 関数 listdir を利用して、path の傘下にある各ノード e(ディレクトリー/ファイル)を順にたどりながら、ツリーを構築します。
  • 関数 isdir を利用して、それがディレクトリーと判定されたなら、再帰呼び出し createNode() によって、適切な処理を繰り返します。
■ アプリケーションを起動する
## ----------------------------------------
def tips():
    root = Tk()
    root.title("Composite")
    root.config(padx=12, pady=4)

    path = "Python-3.0/Mac/Tools"
    tips = TIPS(root, path)
    tips.createNodes()
    tips.makeTree()

    root.mainloop()

path の傘下にある、ディレクトリー/ファイルの階層構造を表現する、ツリーを表示します。

TOP