Каковы шаги для перехода с использования libglade на GtkBuilder?(Python)

StackOverflow https://stackoverflow.com/questions/748872

Вопрос

У меня есть небольшой проект, который использует libglade и использует следующее для загрузки xml-файла:

self.gladefile = "sdm.glade"
self.wTree = gtk.glade.XML(self.gladefile) 
self.window = self.wTree.get_widget("MainWindow")
if (self.window):
    self.window.connect("destroy", gtk.main_quit)
dic = { "on_button1_clicked" : self.button1_clicked, 
        "on_MainWindow_destroy" : gtk.main_quit}
self.wTree.signal_autoconnect(dic)

После преобразования моего проекта в glade, какие структурные изменения мне нужно внести?Я использую Ubuntu 9.04.

Это было полезно?

Решение

Вам нужно использовать gtk.Builder вместо этого.Этот класс может загружать любое количество файлов пользовательского интерфейса, поэтому вам нужно добавить их вручную, либо в виде файлов, либо в виде строк:

self.uifile = "sdm.ui"
self.wTree = gtk.Builder()
self.wTree.add_from_file(self.uifile)

Вместо того , чтобы get_widget, просто используйте get_object в классе builder:

self.window = self.wTree.get_object("MainWindow")
if self.window:
    self.window.connect("destroy", gtk.main_quit)

Чтобы подключить сигналы, просто используйте connect_signals, который также использует словарь:

dic = { "on_button1_clicked" : self.button1_clicked, 
    "on_MainWindow_destroy" : gtk.main_quit}
self.wTree.connect_signals(dic)

Раньше было так (по крайней мере, в GTK + 2.12, не уверен, что это все то же самое), что вы могли бы вызвать connect_signals только один раз любые сигналы, которые не были подключены во время первого вызова, никогда не будут подключены.В glade все было по-другому, так что будьте осторожны, если раньше вы полагались на эту функцию.

Другие советы

Ответ Торстена правильный, но немного неполный, так что в духе http://xkcd.com/979/ вот процедура, на которой я недавно остановился после долгих проб и ошибок:

Откройте yada.glade в Glade interface designer.Перейдите в edit-> project и измените тип проекта на GtkBuilder и убедитесь, что он ориентирован на последнюю версию (2.24 на момент написания этой статьи).Сохраните файл, убедившись, что он сохраняется в формате GtkBuilder, и измените имя с yada.glade на yada.ui

Откройте yada.py и измените следующий код:

gladefile = relativize_filename(os.path.join("glade", "yada.glade"))
self.wTree = gtk.glade.XML(gladefile, self.windowname)

Для:

uifile = relativize_filename(os.path.join("glade", "yada.ui"))
self.wTree = gtk.Builder()
self.wTree.add_from_file(uifile)

Аналогичным образом измените все экземпляры self.wTree.get_widget(...) Для self.wTree.get_object(...)

Изменение self.wTree.signal_autoconnect(dic) Для self.wTree.connect_signals(dic)

Если ваш код зависит от имени, присвоенного виджету в конструкторе интерфейса, измените widget.get_name() Для gtk.Buildable.get_name(widget). widget.get_name() теперь просто возвращает тип виджета.Редактировать:Вам также необходимо измениться widget.set_name('my_widget') Для gtk.Buildable.set_name(widget, 'my_widget').

Удалить import gtk.glade

Я обнаружил множество неиспользуемых сигналов, определенных в XML-файле yada.ui, мне пришлось открыть XML-файл и вручную удалить их, чтобы устранить предупреждения, которые они вызывали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top