Portál AbcLinuxu, 1. května 2025 02:47
Stručný návod pro převod LibGlade.xml na GtkBuilder.xml, který nemusí pokrývat vše co se může při konverzi pokazit.
Glade 3.8.x umí pracovat s LibGlade i GtkBuilder, je určen pro GTK+2. Naproti tomu novější verze jsou určené pouze pro GTK+3. Debian Wheezy bohužel obsahuje pouze verzi pro GTK+3, Bug #638478: allow installing both glade 3.8 and 3.10.
Nejprve si otevřeme LibGlade.xml v Glade 3.8.x, poté uložíme projekt jako GtkBuilder.xml a při ukládání nezapomeneme přepnout radiobutton na GtkBuilder.
U všech widgetů, které využívají property "adjustment", ztratíme toto nastavení. Můžeme to napravit zavoláním následujícího skriptu, kterému se předají dva argumenty reprezentující dva výše uvedené XML soubory. Z LibGlade.xml se načte property "adjustment" jednotlivých witgetů, přidá se k odpovídajícím widgetům z GtkBuilder.xml a výsledek se vypíše na stdout.
$ ./g2b_gtkscale.py LibGlade.xml GtkBuilder.xml >output.xml
#! /usr/bin/env python2.7 # -*- coding: utf-8 -*- import sys from lxml import etree class G2B_GtkScale: def __init__(self, lib_glade_xml, gtk_builder_xml): lib_glade_doc = etree.parse(lib_glade_xml) self.lib_glade_root = lib_glade_doc.getroot() parser = etree.XMLParser(remove_blank_text=True) gtk_builder_doc = etree.parse(gtk_builder_xml, parser) self.gtk_builder_root = gtk_builder_doc.getroot() # LibGlade # <widget class="GtkHScale" id="NAME"> # <property name="adjustment">-255 -255 255 1 0 0</property> # </widget> # GtkBuilder # <widget class="GtkHScale" id="NAME"> # <property name="adjustment">NAME_ADJ</property> # </widget> lib_glade_elts = self.get_elements(lib_glade_doc, "widget") gtk_builder_elts = self.get_elements(gtk_builder_doc, "object") for key in lib_glade_elts.keys(): adjs = lib_glade_elts[key].text.split() prop_adj = gtk_builder_elts[key] self.glade2builder(key, adjs, prop_adj) print etree.tostring(self.gtk_builder_root, pretty_print=True, \ xml_declaration=True, encoding="UTF-8") def get_elements(self, doc, name): result = {} elements = doc.findall(".//%s" % name) for element in elements: eclass = element.get("class") eid = element.get("id") if (eclass in ["GtkHScale", "GtkVScale", "GtkSpinButton"]): for subelt in element.findall("property"): name = subelt.get("name") if (name == "adjustment"): result[eid] = subelt return result def glade2builder(self, eid, adjs, prop_adj): # <object class="GtkAdjustment" id="NAME_ADJ"> # <property name="lower">0</property> # <property name="upper">100</property> # <property name="step_increment">1</property> # <property name="page_increment">10</property> # </object> oid = "%s_ADJ" % eid elt_adj = etree.SubElement(self.gtk_builder_root, "object") elt_adj.set("class", "GtkAdjustment") elt_adj.set("id", oid) #value, lower, upper, step_inc, page_inc, page_size = adjs props = ["lower", "upper", "step_increment", "page_increment"] idx = 1 for prop in props: elt_prop = etree.SubElement(elt_adj, "property") elt_prop.set("name", prop) elt_prop.text = adjs[idx] idx += 1 prop_adj.text = oid #print etree.tostring(elt_adj, pretty_print=True) def main(): if (len(sys.argv) != 3): print "Usage: %s LibGlade.xml GtkBuilder.xml" % sys.argv[0] sys.exit() G2B_GtkScale(sys.argv[1], sys.argv[2]) if __name__ == '__main__': main()
Podrobněji jsem se tím nezabýval, soustředil jsem se pouze na převod svých projektů. Třeba to bude užitěčné i někomu dalšímu. Pokud máte nějakou připomínku, nápad či dotaz, na toto téma, pište do diskuze.
Na základě podnětu diskutujícího chrono uvádím druhé řešení, ke kterému není třeba Glade.
libgtk2.0-dev: /usr/bin/gtk-builder-convert
Výše uvedený distribuční skript nastavuje u nově vytvářených GtkAdjustment id na adjustment1 až adjustmentN. Já chci, aby toto id reprezentovalo id widgetu, ke kterému GtkAdjustment patří, tj. přidá se k němu suffix "_adj".
Řeší to drobná úprava distribučního skriptu gtk-builder-convert
Tiskni
Sdílej:
# aptitude install libgtk2.0-dev $ gtk-builder-convert LibGlade.xml GtkBuilder.xml
Děkuji za připomínku, i Pythonovský skript gtk-builder-convert
řeší property "adjustment", ovšem nastavuje u GtkAdjustment id na adjustment1 až adjustmentN, takže se v tom člověk ztratí. Já nastavuji id na základě názvu widgetu, ke kterému patří tj. NAME_ADJ.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.