Python.use(better) #Tutor: step05 -- def create_Scrollbar(self, master, listbox, orient)

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

def create_Scrollbar(self, master, listbox, orient)

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

基礎編で利用した学習ツールを作成する過程を通して「プログラミング」の理解を深めます。
※ Tcl/Tk で作成した例題を、Python3.1 で再構成しました。

事例:モジュールを起動する

■ 全項目を確認する

全ステップの「項目」を確認するには、関数 do を利用します。

$ python -i tutorTk.py
>>> do()
...
5: step05 -- def create_Scrollbar(self, master, listbox, orient):
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do に実引数を指定します。

>>> do(5)
>>> # -------------------------------------------------- step05

リスト領域の右側には、スクロールバーが現れます。

  • リスト領域(下部)では、任意の項目を選択できます。

任意の項目を選択(ダブルクリック)すると、

  • テキスト領域(上部)には、選択した項目が表示されます。

事例:コードの解説

def step05():
    """def create_Scrollbar(self, master, listbox, orient):"""

    class Tutor(object):
        def __init__(self, master, target):
            self.help = self.create_help(master)
            frame = self.create_Frame(master)
            w = self.create_controller(frame, target)   #@:
            y = self.create_Scrollbar(frame, w, VERTICAL)
            w.grid(row=0, column=0, sticky=NSEW)
            y.grid(row=0, column=1, sticky=NS  )

        ## ----------------------------------------
        def create_Frame(self, master):
            widget = Frame(master)
            widget.rowconfigure   (0, weight=1)
            widget.columnconfigure(0, weight=1)
            widget.pack(fill=BOTH, expand=True)
            return widget

        def create_controller(self, master, target):
            self.items = s = dir(target)

            widget = Listbox(master, font="courier 12")
            widget.pack(fill=BOTH, expand=True)
            widget.bind(
                "",
                lambda *args: self(widget),
                )

            for e in s:
                widget.insert(END, e)
            return widget
        
        ## ----------------------------------------
        def create_Scrollbar(self, master, listbox, orient):
            position = {        # resource
                HORIZONTAL: "x",
                VERTICAL  : "y",
                }
            xy = position[orient]

            widget = Scrollbar(master, orient=orient)
            widget.config(command=getattr(listbox, "%sview"%xy))
            listbox["%sscrollcommand"%xy] = widget.set
            return widget
■ #1: メソッド __init__
        def __init__(self, master, target):
            ...
            w = self.create_controller(frame, target)   #@:
            y = self.create_Scrollbar(frame, w, VERTICAL)
            w.grid(row=0, column=0, sticky=NSEW)
            y.grid(row=0, column=1, sticky=NS  )

格子を使って、任意の widget を配置できます。

  • 縦方向 NS にスクロールバー y を配置します。
■ #2: 格子を再構成する
        def create_Frame(self, master):
            ...
            widget.rowconfigure   (0, weight=1)
            widget.columnconfigure(0, weight=1)

メソッド rowconfigure は、指定した格子「行」を再構成します。

  • 0 番目の格子「行」を再構成します。

引数 columnconfigure は、指定した格子「列」を再構成します。

  • 0 番目の格子「列」を再構成します。

引数 weight= には、重み付けの係数を指定します。この値に従って、外部部品の大きさが変化(拡大/縮小)したときの量に対して、内部格子の大きさ(幅/高さ)をどの割合で変化させるかが決まります。
@ここでは、ウィンドウを操作したときに、下側のスクロールバーは水平方向だけに、右側のスクロールバーは垂直方向だけに、その大きさが変化するように設定しています。

■ #3: クラス Listbox
        def create_controller(self, master, target):
            ...
            widget = Listbox(master, font="courier 12")
            ...
            return widget

生成した Listbox をリターン値にします。

■ #4: クラス Scrollbar
        def create_Scrollbar(self, master, listbox, orient):
            position = {        # resource
                HORIZONTAL: "x",
                VERTICAL  : "y",
                }
            xy = position[orient]

            widget = Scrollbar(master, orient=orient)
            widget.config(command=getattr(listbox, "%sview"%xy))
            listbox["%sscrollcommand"%xy] = widget.set
            return widget

部品の操作に合わせてスクロールバーを再表示するには、テキスト部品 Text をスクロールバー Scrollbar に関係付けておきます。

  • xscrollcommand= に、Scrollbar の再表示を促すメソッド set を設定します。すると、テキスト部品を操作してイベントが発生したときに、コールバック xscrollcommand を介して set が起動されます。
  • yscrollcommand= についても、同様です。

スクロールバーの操作に合わせて部品を再表示するには、スクロールバー Scrollbar をテキスト部品 Text に関係付けておきます。

  • command= に、Text の再表示を促すメソッド xview を設定します。すると、スクロールバーを操作してイベントが発生したときに、コールバック command を介して xview が起動されます。
  • yview についても、同様です。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/09