Python 弾丸ツアー #DP: ツリー ... step 3: アプリケーションを起動する

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

Python.use(better); Python 弾丸ツアー #DP: Tkinter/Python
>>> ツリー(階層構造)
step 3: アプリケーションを起動する
《Python3.1|Jython2.5|IronPython2.6》

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

step 3: Command を導入する

■ アプリケーションを起動する
from tkinter import *

## ----------------------------------------
def tips():    
    root = Tk()
    root.title("Step3: Command")
    root.config(padx=12, pady=4)

    path = "Python-3.0/Mac/Tools"
    tips = TIPS(root, path)
    tips.createNodes()
    print("-"*40,"print(tips.tree)")
    print(tips.tree)
    print("-"*40,"tips.tree.print()")
    tips.tree.print()

    root.mainloop()

 ̄アプリケーションを起動すると、フォルダー path を頂点とするツリー(フォルダー/ファイルの階層構造)を表示します。表示されるタイトルを除いて、step2 と同じです。

■ Composite::Component
from os import listdir
from os.path import join, isdir
from functools import reduce
from os.path import getsize, getatime, getmtime, getctime
from time import ctime

## ---------------------------------------- Composite::Component
class Component(object):
    def __init__(self, path, item):
        self.path = path
        self.item = item

    ## ---------------------------------------- Iterator::Iterator
    def __iter__(self): pass
    def add_(self, component): pass

    def print(self):
        for i, e in zip(self.indents(), self.items()):
            print("%s%s"%("+  "*i, e))

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

    def __init__(self, path, item):
        self.path = path
        ...

 ̄メソッド __init__ では、新たなインスタンス属性 self.path を追加して、ツリーの頂点にあるフォルダーのパス(文字列)を初期設定します。□

■ Command::Receiver
    ## ---------------------------------------- Command::Receiver
    def createPanel(self):
        top = Toplevel()
        top.title(self.item)
        top.config(padx=16, pady=4)

        current = join(self.path, self.item)

        frame = Frame(master=top)
        frame.pack()
        item = "getsize"
        w = Label(master=frame, text=item)
        w.pack(side=LEFT)
        w = Entry(master=frame, width=10)
        w.pack(side=LEFT)
        w.insert(END, getsize(current))

        frame = Frame(master=top)
        frame.pack()
        items = "getatime", "getmtime", "getctime", 
        for i, e in enumerate(items):
            w = Label(master=frame, text=e)
            w.grid(row=i, column=0, sticky=E)
            w = Entry(master=frame, width=22)
            w.grid(row=i, column=1, sticky=W)
            w.insert(END, eval("ctime(%s('%s'))"%(e, current)))

 ̄メソッド createPanel では、ツリーの各ノードの情報を提示するための、新たなパネルを生成します。□

《Point》式を評価する:組み込み関数 eval の引数に文字列を指定すると、それを「式として評価」した結果が得られます。

        current = join(self.path, self.item)
        ...
        items = "getatime", "getmtime", "getctime", 
        for i, e in enumerate(items):
            ...
            w.insert(END, eval("ctime(%s('%s'))"%(e, current)))

とすると、for に続く制御変数 e は、タプル items の各要素(文字列)を順に参照するので、

            w.insert(END, eval("ctime(getatime('_'))"))
            w.insert(END, eval("ctime(getmtime('_'))"))
            w.insert(END, eval("ctime(getctime('_'))"))

書式指定 %s に従って、このような文字列に置換されます。つまり、次のようなコードの断片

            w.insert(END, ctime(getatime('_')))
            w.insert(END, ctime(getmtime('_')))
            w.insert(END, ctime(getctime('_')))

と同等の結果が得られます。□

TOP
》作業中です《