Сохранить переменную, возвращаемую обработчиком сигнала?

Я пишу приложение на Python 2.7 с использованием PyGTK 2. В основном я создаю виджет TreeView, заполняю его содержимым, а затем проверяю, изменился ли выбор. Когда это правда, я хочу, чтобы выбор был напечатан в поле 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())

но, конечно, это не работает.


person Sayid    schedule 17.11.2012    source источник


Ответы (1)


Обработчику сигнала не имеет смысла возвращать значение, возвращать его куда?

Обработчик сигнала должен быть методом класса, где имеет смысл хранить значение как атрибут, т.е.:

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
  • в методе подключения измените 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)
    ...

Но я думаю, что первый - это стандартный подход.

person pmoleri    schedule 17.11.2012
comment
Ну, на самом деле я знаю, что это можно сделать так, но вопрос заключался в том, можно ли и как хранить переменную возвращаемую обработчиком сигнала? Я отредактирую вопрос, чтобы избежать недоразумений. - person Sayid; 18.11.2012
comment
Вы не можете сохранить возвращаемое значение. Вы регистрируете функцию, которая будет вызываться объектом TreeView при изменении выбора, поэтому ваш обработчик вернет значение методу в объекте TreeView, который не заботится о возвращаемом значении. - person pmoleri; 18.11.2012