Какие шаги нужно выполнить, чтобы перейти от использования libglade к GtkBuilder? (Python) - PullRequest
5 голосов
/ 14 апреля 2009

У меня есть небольшой проект, который использует 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)

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

Ответы [ 2 ]

11 голосов
/ 15 апреля 2009

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

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

Вместо get_widget, просто используйте get_object в классе построителя:

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 только один раз, любые сигналы, которые не были подключены во время первого вызова, никогда не будут подключены. Это было по-другому на поляне, поэтому будьте осторожны, если вы использовали эту функцию раньше.

5 голосов
/ 30 ноября 2011

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

Откройте yada.glade в конструкторе интерфейсов Glade. Перейдите в 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-файл и вручную удалить их, чтобы устранить вызванные ими предупреждения.

...