Python 弾丸ツアー #DP: ツリー ... step 3: アプリケーションを起動する
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
》作業中です《