Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [opgelost] Combobox altijd leeg?  (gelezen 2519 keer)

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
[opgelost] Combobox altijd leeg?
« Gepost op: 2009/08/14, 17:21:55 »
Goedemiddag jongens en meiden,

ik zit met een probleempje. Ik heb in Glade een GUI gemaakt, die goed functioneert afgezien van de Combobox. Hieronder de relevante code:
*knip*
<child>
 <object class="GtkComboBoxEntry" id="comboboxEdit">
  <property name="visible">True</property>
  <property name="model">liststore1</property>
 </object>
 <packing>
  <property name="position">1</property>
 </packing>
</child>
*knip*
<object class="GtkListStore" id="liststore1">
 <columns>
  <!-- column-name gchararray1 -->
   <column type="gchararray"/>
  </columns>
  <data>
   <row>
    <col id="0" translatable="yes">Tekst</col>
   </row>
  </data>
 </object>
De combobox is echter leeg. Nu heb ik natuurlijk op internet gezocht naar een oplossing; de tip wordt gegeven zelf de liststore aan te maken. Gedaan en dan wordt mijn code zoiets (glade code ongewijzigd):
       self.builder = gtk.Builder()
        self.builder.add_from_file(glade_file)

        self.edit = self.builder.get_object("comboboxEdit")

        data=["harry","pat","june","sarah","william"]
        store=gtk.ListStore(str)
        store.append(["Choose a name"])
        for d in data:
            store.append([d])
        self.edit.set_model(store)
        self.edit.set_active(0)
De entrybox groeit wel naarmate er meer dingen worden toegevoegd, maar er komt niets in te staan en de volgende waarschuwing komt tevoorschijn als ik op een entry klik:
(rhythmbox:13383): Gtk-CRITICAL **: gtk_entry_set_text: assertion `text != NULL' failedWeet iemand raad? Of gewoon een andere manier om een combobox te vullen?
« Laatst bewerkt op: 2009/08/16, 11:44:57 door MartijnB »

Re: Combobox altijd leeg?
« Reactie #1 Gepost op: 2009/08/14, 17:26:49 »
Dit is de manier die ik over het algemeen volg om een combobox te vullen:

   for item in items:
        combobox.get_model().append([item])

Er is echter nog een makkelijker manier. Ik heb perongeluk gevonden dat als ge in Glade een combobox maakt, en daarna items toevoegd (in Glade) en deze daarna terug verwijderd. Dan kunt ge de append_text(), prepend_text(), insert_text(), etc. gebruiken direct op de combobox zonder het model eerst op te vragen.

Ow, misschien erbij zeggen dat ik mijn project nog steeds in Libglade maak, maar normaal zou het hetzelfde moeten zijn met gtkbuilder.

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
Re: Combobox altijd leeg?
« Reactie #2 Gepost op: 2009/08/14, 22:01:28 »
    for item in items:
        combobox.get_model().append([item])
werkt op zich wel, maar de lijst blijft leeg (zoals op de screenshot). Voeg ik 5 items toe, komen er 6 lege vakken. Voeg ik 6 items toe, komen er 7 legen vakken, etc.

Enig idee wat ik fout doe? Nog steeds dezelfde foutmelding als ik op een item klik trouwens.

Re: Combobox altijd leeg?
« Reactie #3 Gepost op: 2009/08/14, 22:04:21 »
Hmm bizar, dus het word wel toegevoegd, alleen ziet ge niks.

En wat als ge het volgende doet:
    for item in items:
        combobox.append_text(item)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Combobox altijd leeg?
« Reactie #4 Gepost op: 2009/08/14, 22:54:30 »
GTK+ is niet erg intuïtief en vrij onlogisch in o.a. dit soort dingen.

Try this:

        store = gtk.ListStore(str)
        data = ["harry", "pat", "june", "sarah", "william"]
        for d in data:
            store.append([d])

        self.edit.set_model(store)
        cell = gtk.CellRendererText()
        self.edit.pack_start(cell, True)
        self.edit.add_attribute(cell, 'text', 0)

Let wel op dat het iets anders moet voor een GtkComboBoxEntry...
Hier vind je meer info: http://faq.pygtk.org/index.py?req=show&file=faq16.008.htp

Waarom kies je er trouwens voor om met GTK+ te programmeren? Ben erg benieuwd naar je motivatie. 'k Heb zelf heel wat toolkits gebruikt, tesamen met andere studenten, voor verschillende projecten, maar de consensus van mijn medestudenten was dat GTK+ eigenlijk geen enkel voordeel te bieden heeft tegenover vele andere open source UI toolkits, waaronder Qt en wxWidgets. Ik heb toen geprobeerd om GTK+ te verdedigen, maar ik kon eerlijk gezegd geen enkel tegenargument bedenken... 'k Ben dus zeer benieuwd naar jouw argumenten.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline MartijnB

  • Lid
    • http://www.mbastiaan.nl
Re: Combobox altijd leeg?
« Reactie #5 Gepost op: 2009/08/15, 09:37:05 »
En wat als ge het volgende doet:
    for item in items:
        combobox.append_text(item)
Zelfde effect. Die één rij meer komt natuurlijk doordat ik er al één heb gedefineerd met Glade

Let wel op dat het iets anders moet voor een GtkComboBoxEntry...
(09:32:25) [0x82c8408] [ConfigurationDialog.__init__] .gnome2/rhythmbox/plugins/lyricWiki/LyricsConfigurationDialog.py:75: <gtk.ComboBoxEntry object at 0x8d1bcac (GtkComboBoxEntry at 0x86c1410)>Oeps, sorry jongens :-[. De oplossing van profoX werkt, bedankt :). Beetje raar dat je door zoiets, relatief, low-levels moet gaan in Python.

Mijn motivatie om in GTK+ te programmeren is eigenlijk heel simpel: ik schrijf een plugin voor Rhythmbox. Ik ben zeker van plan Qt4 te leren, aangezien ik daar veel goede dingen over hoor.

Edit: Werkt Qt4 eigenlijk heel anders dan GTK+, of valt dat wel mee?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Combobox altijd leeg?
« Reactie #6 Gepost op: 2009/08/15, 11:44:32 »
De oplossing van profoX werkt, bedankt :). Beetje raar dat je door zoiets, relatief, low-levels moet gaan in Python.
Graag gedaan. En inderdaad raar, maar zo ken ik GTK+ wel =D

Mijn motivatie om in GTK+ te programmeren is eigenlijk heel simpel: ik schrijf een plugin voor Rhythmbox. Ik ben zeker van plan Qt4 te leren, aangezien ik daar veel goede dingen over hoor.

Edit: Werkt Qt4 eigenlijk heel anders dan GTK+, of valt dat wel mee?
Het basisprincipe is hetzelfde, maar Qt is in tegenstelling tot GTK+ meer dan enkel een GUI toolkit. Zo bevat Qt behalve een geavanceerd GUI-systeem o.a. modules voor 3D ondersteuning, geavanceerde multithreading, inter-objectcommunicatie, XML, database interactie, netwerkfunctionaliteit, SVG, een uitgebreid 2D graphics systeem, een multimedia framework voor simpele audio- en videoweergave, een state-of-the-art webbrowser engine (gebaseerd op Webkit), een scripting engine, een plug-in systeem, en nog veel meer... Maar de manier van programmeren in Qt is wel heel anders. Anders, maar wel heel logisch, consistent, gemakkelijk, en met een stabiele API ;) Als je meer wil weten over de mogelijkheden en technische werking van Qt moet je hier eens kijken - http://doc.trolltech.com/latest - vooral dan bij de kopjes Core Features en Key Technologies, of bekijk enkele Examples
« Laatst bewerkt op: 2009/08/15, 19:19:37 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)