0

私は PyGTK 2 を使用して Python 2.7 でアプリケーションを作成しています。基本的には TreeView ウィジェットを作成し、コンテンツを入力してから、選択が変更されたかどうかを確認します。true の場合、選択範囲を TextView ボックスに出力します。私の考えは、選択した値を取得し、テキストを更新し、ウィジェットを更新することです。選択した値を取得する方法は次のとおりです。

意味:

class SomeClass:
    def __init__(self):
        ...
        someTextView = build_textview("some text")
        ...
        tree_selection = someTreeView.get_child().get_selection()
        tree_selection.connect("changed", self.selection_changed())
        ...

    # Signal handler: 
    def selection_changed(self, widget, data=None):
        (model, pathlist) = widget.get_selected_rows()
        for path in pathlist :
            tree_iter = model.get_iter(path)
            value = model.get_value(tree_iter,0)
            return value

ご覧のとおり、selection_changed ハンドラーは値を返します。問題は、ハンドラーが呼び出された後にその値を保存するにはどうすればよいですか? グローバル変数またはクラス属性を使用できることはわかっていますが、それはオプションではありません。コーデをすっきりさせたい。つまり、そのように:

tree_selection.connect("changed", value=self.selection_changed())

しかし、もちろんうまくいきません。

4

1 に答える 1

0

シグナルハンドラが値を返すのは意味がありません。どこに返すのですか?

シグナルハンドラは、値を属性として格納することが理にかなっているクラスのメソッドである必要があります。つまり、次のようになります。

class SomeClass:
    def __init__(self):
        self.value = None
        ...
        someTextView = build_textview("some text")
        ...
        tree_selection = someTreeView.get_child().get_selection()
        tree_selection.connect("changed", self.selection_changed)
        ...

    def selection_changed(self, widget, data=None):
        (model, pathlist) = widget.get_selected_rows()
        for path in pathlist :
            tree_iter = model.get_iter(path)
            value = model.get_value(tree_iter,0)
            this.value = value
            return

ノート:

  • __init__メソッドは value 属性を宣言します
  • connect メソッドの変更self.selection_changed()self.selection_changedは、メソッドの結果ではなく、メソッド自体を渡します。
  • selection_changedメソッドは属性に値を格納し、何も返しません。

それが役に立てば幸い。

アップデート

値を格納する場所を明示的に示した方がコードの見栄えが良くなると感じる場合は、次のようにすることができます。

def __init__(self):
    self.value = None
    ...
    someTextView = build_textview("some text")
    ...
    def selection_changed_handler(widget, data):
        value = self.selection_changed(widget, data)

    tree_selection = someTreeView.get_child().get_selection()
    tree_selection.connect("changed", selection_changed_handler)
    ...

しかし、最初のものは標準的なアプローチだと思います。

于 2012-11-17T22:14:58.380 に答える