LINUX.ORG.RU

Pygtk. Сохранение информации в родителе.

 ,


0

1

Ситуация такая:

В начале работы с программой главное окно (экземпляр класса Viewer) при инициализации создает еще одно окно - стартовое меню - экземпляр Bases() (ListStore + TreeView). Юзер, выбирает одно из значений (путь к базе) в Bases(), которое должно быть учтено при заполнении Viewer'a данными. Решил хранить переменную с путем к базе в объекте-родителе обоих классов, Common(). Но не пойму, как ее перезаписать из child.

Пока писал, понял, что надо было просто запустить Bases отдельно, получить оттуда данные. Потом запустить Viewer с учетом полученных данных. Тем не менее, все равно охота получить ответ на вопросы (они - ниже).

Вот что набыдлокодил:


def class Common():
    ''' Коллбэки и проч '''
    ....
    self.base_path = 'empty'

def class Viewer(Common):
    def __init__(self, b_name):
        Common.__init__(self)
        ...
        self.bss = Bases(b_name)
        self.bss.window_b.connect('hide', self.print_main_path)

     def print_main_path(self, win):
        print self.main_path
   
def class Bases(Common):
    def __init__(self):
        Common.__init__(self)
        self.window_b = gtk.Window(gtk.WINDOW_TOPLEVEL)
        .....
        self.b_tv = gtk.TreeView()
        .....
        self.window_b.set_type_hint (gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
        self.window_b.show()
        self.window_b.connect("destroy", self.destroy_cb) 

        self.b_tv.connect('row-activated', self.base_hide)

    def base_hide(self, tv, path, column):
        ... get full_path from TreeView ...
        self.base_path = full_path
        self.window_b.hide()
        

1. Так вообще делать стоит? 2. Проблема тут в том, что коллбэк в Viewer печатает не full_path, а «empty». Как обновить переменную в родительском объекте? 3. Подскажите нормальный способ передавать данные из одного объекта в другой - попадаются какие-то костыльные методы все время.

★★

Дошло, наконец. У меня получилось два разных экземпляра Common(), поэтому переменная в них имеет разное значение. Но остается вопрос, как передать значение из Bases во Viewer. Попробую наследовать Common -> Viewer -> Bases

frpaul ★★ ()

def class

Эм, это точно питон?

Kilte ★★★★★ ()

Всё-таки осилил твою простыню.

Решил хранить переменную с путем к базе в объекте-родителе обоих классов

Наследование так не работает.

Это два разных объекта, они ничего не знают друг о друге, соответственно данные там будут разные. Ты хочешь глобальную переменную.

Как-то так лучше сделать:

bases = Bases()
viewer = Viewer()
tree_view = TreeView()
tree_view.connect('row-activated', viewer.on_row_activated)
tree_view.connect('row-activated', bases.on_row_activated)

Kilte ★★★★★ ()
Последнее исправление: Kilte (всего исправлений: 2)
Ответ на: комментарий от Kilte

Да, с объявлением класса ошибся, когда сокращал код для LORа

Неожиданное для меня решение. Я бы точно не догадался вытащить TreeView из класса. Спасибо, попробую.

frpaul ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.