Как повторно использовать дерево виджетов из файла поляны с помощью GtkBuilder?

я хочу заполнить gtk.notebook на лету. каждый раз, когда пользователь открывает файл, создается новая вкладка блокнота. довольно прямо вперед. моя проблема в том, что я использую поляну для создания пользовательского интерфейса, а вкладка ноутбука должна иметь дочернее дерево виджетов (scrolledwindow-> viewport-> выравнивание-> кадр). в моем файле поляны у меня есть шаблонная вкладка блокнота, которую я хочу использовать несколько раз, чтобы мне не приходилось кодировать все дерево в простом gtk. с libglade вы можете повторно использовать дерево виджетов, как описано в часто задаваемых вопросах pygtk здесь: http://faq.pygtk.org/index.py?file=faq22.011.htp&req=show . Как мне это сделать с помощью GtkBuilder?

заранее спасибо,

Артур


person Fookatchu    schedule 05.12.2010    source источник
comment
Вам случайно не удалось использовать метод Builder.connect более одного раза (т.е. вызвать его снова после добавления дополнительного виджета)? Если да, то как вы это сделали?   -  person mac    schedule 27.06.2011


Ответы (1)


Сделайте это с помощью GtkBuilder:

builder = gtk.Builder()
builder.add_from_file("GUI.xml")
builder.connect_signals(self)
self.window1 = builder.get_object("window1")
self.window1.show()

изменить:

Сначала я ошибался, кажется, что gtkbuilder создает экземпляры объектов при добавлении. Таким образом, идеальным способом сделать это было бы добавить виджет вручную через строку

builder.add_from_string("""
<interface>
  <object class="GtkWindow" id="window1">
    <child>
      <object class="GtkComboBox" id="combobox1">
        <property name="model">liststore1</property>
      </object>
    </child>
  </object>
</interface>""")

self.window1 = builder.get_object("window1")

Надеюсь, это работает!

person Victor Parmar    schedule 05.12.2010
comment
хорошо, это добавляет объект window1 только один раз, но мне нужно создать экземпляр другого или нескольких объектов с именем window1 - person Fookatchu; 05.12.2010
comment
не могли бы вы попробовать сделать self.window2 = builder.get_object("window1")? Я думал, что он создает для вас новый объект. Я проверю это, когда вернусь домой :) - person Victor Parmar; 06.12.2010
comment
нет, не работает. я пробовал это, и он возвращает тот же объект. - person Fookatchu; 06.12.2010
comment
Вы были правы, проверьте правку, mail-archive. com/[email protected]/msg06030.html - person Victor Parmar; 06.12.2010
comment
спасибо за редактирование! не тот ответ, который я надеялся получить, но он сделает свою работу! еще раз спасибо. - person Fookatchu; 07.12.2010