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

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

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

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

step 1: Composite を導入する

■ TIPS Tkinterコンポーネント

Tkinter では、便利な GUI コンポーネントwidget)が提供されています。これらをウィンドウ内に配置するだけで、GUI を活用したアプリケーション開発が容易になります。

● Label

 ̄ラベル Label は、ウィンドウ内にテキスト(文字列)を配置したいときに便利です。ラベルを生成するには、クラス呼び出し Label() を利用します。すべての部品に共通するのは、クラス呼び出しにおいて、

  • その第1引数に、その部品を配置する親を指定する

ことです。

        Label (frame, text=tab , font=font)

ここでは、フレーム frame を親に指定したので、生成したラベルは(ウィンドウではなく)フレーム内に配置されます。さらにクラス呼び出しでは、第1引数の後に「任意のキーワード引数」を指定できます。

 ̄キーワード引数 text= に続いて、表示したいテキスト(文字列)を指定します。このとき、

    def createNodes_(self, parent, path, indent=0):
        ...
        tab_folder = "  + "
        tab_file   = "  . "

フォルダー tab_folder とファイル tab_file とでは、異なるラベルが提示されます。さらに、キーワード引数 font= に続いて、使用したいフォントを指定します。このとき、

        font = "courier 12"

font を設定するのに、フォントの名前、大きさを空白で区切った文字列を利用しています。

● Button

 ̄同様にして、ボタン(Button)を生成するには、クラス呼び出し Button() を利用します。

        Button(frame, image=image)

ここでは、フレーム frame を親に指定したので、生成したボタンは(ウィンドウではなく)フレーム内に配置されます。
 ̄キーワード引数 image= に続いて、表示したいイメージ(画像)を指定します。このとき、

class TIPS(object):     # Client
    def __init__(self, master, path):
        self.folder_image = PhotoImage(file="_image/folder.gif")
        self.file_image   = PhotoImage(file="_image/file.gif")

フォルダー folder_image とファイル file_image とでは、異なる画像が提示されます。

● Frame

 ̄フレーム Frame は、任意のコンポーネントを配置する「矩形領域」を確保したいときに便利です。クラス呼び出し Frame() では、

        frame = Frame(master)

引数 master が参照する任意のフレーム Frame を親に指定していますが、アプリケーションの最上位では、

def tips():
    root = Tk()
    ...
    tips = TIPS(root, path)
    tips.createNodes()

ウィンドウ Tk を親に指定しているので、その中に任意のコンポーネントを配置することになります。

《Point》ここで注目して欲しいのは、引数 master によって参照される親コンポーネントは「実行時」に確定することです。この動的な性質の恩恵によって、要求仕様の変更にも柔軟に対処できるコードを記述すると「プログラミングの効率化」が期待できます。□

■ 何が問題か

 ̄メソッド createNodes_ の本体には「重複する」記述があり、肥大な(20行を超えるメタボ)コードの断片や、if 文による「条件分岐」が存在します。これらの問題を解消するために、次の step2 では、Iterator パターンを導入します。□

TOP
》作業中です《