Java.use(better, Python) # Swing《8》インスペクター:状態を更新したいなら

記事一覧 Java.use(better, Python) # Swing《Jython2.5》
《こちらに移動中です》2007年4月11日 (水)

インスペクター:状態を更新したいなら

《著》伊藤うさぎ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23

※ JPython1.1/Jython2.2 で作成した例題を、Jython2.5 で再構成しました。

インスペクターを利用して、オブジェクトの状態を更新できるようにします。

インスペクター:状態を更新したいなら

話を先に進める前に、ここでひとつ実験をします。それは、生成したばかりのワークスペースの状態を、インスペクターを使って探索することです。

    it = Workspace()
    Inspector(it)

このコードを実行すると、ワークスペースの状態を表わすインスペクターが現われます。すると、リスト項目には、クラス Workspace で定義したメソッドなどが、列挙されているのが分かります。

たとえば、項目 evaluate を選択すると とあることから、クラス Workspace で定義したメソッド evaluate は、そのインスタンスから参照できる、つまり適用可能なメソッドであることが分かります。

同様に、生成したばかりのインスペクターの状態を、インスペクター自身を使って探索できます。それは、受講者のみなさんの課題に残して、話を先に進めます。

■ オブジェクトの状態を更新する

インスペクターを利用して、オブジェクトの状態を更新できるようにします。

    def _accept(self, e):
        name = self._listView.selectedValue
        self.evaluate(
            self.source_accept(self.textView.selectedText))
        setattr(self.it, name, _self_)
    def source_accept(self, text):
        return text + "\n" \
            + "global _local_; _local_ = locals()" + "\n" \
            + "global _self_; _self_ = %s"%text.splitlines()[-1]
    def evaluate(self, source):
        eval(compile(source, "(*.*)", "exec"),
                globals(), self._local_)

おもな変更点は、次のようになります。

  • 関数 _accept では、選択したリスト項目 _listView.selectedValue と同じ名前を持つ属性値として、テキスト領域に表示されたコードを評価(実行)した結果を設定します。
  • 関数 source_accept では、選択したコードの断片を実行します。

基本的な考え方は、これまでと同じです。選択したコードの断片 textView.selectedText に続けて、大域変数 global _local_ を宣言して、これに現在の局所変数の情報 locals() を保持します。さらに、大域変数 global _self_ を宣言して、これに式を評価した結果を保持します。すると、コードを実行するたびに、最後に評価した式の値が保持されます。

組み込み関数 setattr(object,name,value) は、引数 object が参照するオブジェクトに、引数 name と同じ名前を持つ属性値として value を再設定します。ここで、setattr(object,'attr',value) は、object.attr=value と同等です。

    def __init__(self, it):
        self.it = it
        self.inspectorView()
        self._local_ = {}
    def listView(self):
        ...
        self._listView = JList(
            model=model, valueChanged=self._display)
        ...

その他の変更点として、メソッド間で共有したい情報は、属性 _local_ および _listView を介して参照できるようにします。

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


関連記事

Last updated♪2009/08/15