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

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

Visitor #2

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

概要

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

事例:コードの解説

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

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

    def __init__(self, tree=None, path=None, **keys):
        self.items = []
        self.top    = self.create_Toplevel(tree=tree)
        self.widget = self.create_widget(master=self.top, tree=tree)

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

    def create_Toplevel(self, tree):
        widget = Toplevel()

        s = tree.path.split("/")
        title = "%s: %s"%(s[-1],"/".join(s[:-1]))

        widget.title(title)
        widget.config(padx=16, pady=4)
        return widget

メソッド create_Toplevel では、新たな Toplevel を生成して、それをリターン値にします。

■ ButtonTreeWidget
## ----------------------------------------
class ButtonTreeWidget(TreeWidget):

クラス ButtonTreeWidget では、コンポーネントを使ってツリーを表現します。

    def __init__(self, tree=None, path=None, **keys):
        self.dirImage  = PhotoImage(file="_image/folder.gif")
        self.fileImage = PhotoImage(file="_image/file.gif")

        super().__init__(tree, path)
        tree.accept_(TreeVisitor(self))

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

  • tree に TreeVisitor を登録します。
    def create_widget(self, master, tree):
        widget = Frame(master=master)
        widget.pack()
        return widget

メソッド create_widget では、新たな Frame を生成して、それをリターン値にします。

    def append(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, receiver=node).pack(side=side)
        Label(frame, text=node.item, font=font   ).pack(side=side)

メソッド append では、新たな Frame を生成して、そこに他の部品を配置します。

■ TextTreeWidget
## ----------------------------------------
class TextTreeWidget(TreeWidget):

クラス TextTreeWidget では、文字列を使ってツリーを表現します。

    def __init__(self, tree=None, path=None, **keys):
        super().__init__(tree, path)
        tree.accept_(TextVisitor(self))

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

  • tree に TextVisitor を登録します。
    def create_widget(self, master, tree):
        widget = Text(master=master, width=52)
        widget.pack()
        widget.insert(END, "%s\n"%tree.path)
        return widget

メソッド create_widget では、新たな Text を生成して、それをリターン値にします。

    def append(self, string):
        self.widget.insert(END, string)

メソッド append では、widget の末尾に文字列 string を追加します。

■ アプリケーションを起動する
## ----------------------------------------
def tips():
    root = Tk()
    root.title("Visitor")
    root.geometry("150x50")

    path = "Python-3.0/Mac/BuildScript"
    tips = TIPS(root, path)
    tips.createNodes()
    tree = TextTreeWidget(tree=tips.tree)
    tree = ButtonTreeWidget(tree=tips.tree)

    root.mainloop()

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

  • TextTreeWidget は、文字列を使ってツリーを表現します。
  • ButtonTreeWidget は、コンポーネントを使ってツリーを表現します。

TOP


関連記事

Last updated♪2009/11/02