Java.use(better, Python) # Swing《8》インスペクター:状態を更新したいなら
‖記事一覧‖ Java.use(better, Python) # Swing《Jython2.5》《復刻版》
《こちらに移動中です》2007年4月11日 (水)
インスペクター:状態を更新したいなら
※ Jython2.2 で作成した例題を、Jython2.5 で再構成しました。
インスペクターを利用して、オブジェクトの状態を更新できるようにします。
インスペクター:状態を更新したいなら
話を先に進める前に、ここでひとつ実験をします。それは、生成したばかりのワークスペースの状態を、インスペクターを使って探索することです。
it = Workspace() Inspector(it)
このコードを実行すると、ワークスペースの状態を表わすインスペクターが現われます。すると、リスト項目には、クラス 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