gtk.Builder () и разрывы файлов с несколькими полями - PullRequest
2 голосов
/ 25 января 2010

У меня есть графический интерфейс пользователя glade, и я хочу вставить другой объект, используя файл glade.

Когда я делаю это, как показано ниже (это, по сути, то, что я делаю), целое приложение зависает и self.show () и максимально загружает процессор на 100%. Если я заменю первую строку своей init () на self.builder = gtk.Builder (), то приложение запустится, я могу установить виджеты, то есть: установить содержимое записей, установить и изменить значения ComboBoxes. Но я не могу отвечать на сигналы, нажатия кнопок никогда не вызывают обработчик.

В реальном коде объект два установлен как страница в записной книжке, и у меня есть несколько других страниц, gtk.main () находится в объекте, который владеет записной книжкой. Все это работает, как и ожидалось, это просто объект, который выходит из строя.

Есть какие-нибудь подсказки? Я пытался вызвать self.builder.connect_signals () для каждого виджета, но он все равно не замечает их.

class one(gtk.VBox):
 def __init__(self, builder):
        gtk.VBox.__init__(self)
        self.builder = builder  # if this is self.builder = gtk.Builder() app runs but widget signals go missing.
        self.builder.add_from_file("ui_for_one.glade")
     self.show()  # Endless loop here?

class two(object):  # This is the page in a notebook.   
 def __init__(self):
  self.builder = gtk.Builder()
  self.builder.add_from_file("ui_for_two.glade")
  self.some_container = self.builder.get_object("some_container")
  self.one = one(self.builder)
  self.some_container.pack_start(self.one, False, False)

1 Ответ

3 голосов
/ 25 января 2010

Есть ли веская причина для использования одного и того же объекта gtk.Builder в двух классах?
Это может быть причиной вашей проблемы. В вашем классе one вы загружаете файл glade, но вы ничего не делаете с его виджетами. Примерно так должно работать:

class one(gtk.VBox):

  def __init__(self):
    gtk.VBox.__init__(self)
    self.builder = gtk.Builder()
    self.builder.add_from_file("ui_for_one.glade")
    some_widget = self.builder.get_object("some_widget")
    self.add(some_widget)
    self.builder.connect_signals(self)
    # No reason to call self.show() here, that should be done manually.

  #Your callback functions here

class two(object):  # This is the page in a notebook.   

  def __init__(self):
    self.builder = gtk.Builder()
    self.builder.add_from_file("ui_for_two.glade")
    self.some_container = self.builder.get_object("some_container")
    self.one = one()
    self.some_container.pack_start(self.one, False, False)
    self.some_container.show_all() #recursively show some_container and all its child widgets

    self.builder.connect_signals(self)

Для получения дополнительной информации, ознакомьтесь с этими учебниками по Glade .

...