Wie kann man auf den Text in einer ComboBoxEntry zugreifen ?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Jo
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2006, 13:38
Kontaktdaten:

Hey hab im folgenden Code das Problem das ich nicht auf den ausgewählten Text vom ComboBoxEntry zugreifen. Die Funktion [model.get_value(iter, 0)] liefert mir immer das erste Element. Liegt das Problem vielleicht darin, dass ich das iter beim einlesen setzen sollte?
Oder kann mir wenigstens jemand sagen wie der TreeIter aufgebaut ist,bzw was das genau ist?
Das komische ist das der Iter auch jedes mal einen neuen Wert ausgibt, wodurch ich somit auch nicht über Umwege auf den angewählte Text zugreifen kann. Die Angliederung an ein Glade Projekt macht dies nicht gerade leichter.:(

Code: Alles auswählen

import pygtk
pygtk.require('2.0')
import gobject, gtk, gtk.glade
from gtk import*


class Geometrie:

    def __init__(self):
        self.bml=gtk.glade.XML('Test2.glade')
        self.bml.signal_autoconnect(self)
        self.W_einlesen()
            
    def W_einlesen(self):
        WZlist=[]
        WZlist.append(['Name','Typ'])
        WZlist.append(['Name2','Typ2'])
        WZlist.append(['Name3','Typ3'])
        WZlist.append(['Name4','Typ4'])
        WZlist.append(['Name5','Typ5'])
        WZlist.append(['Name6','Typ6'])
        WZlist.append(['Name7','Typ7'])
        store = gtk.ListStore(gobject.TYPE_STRING)
        for i in range (6):
            werkzeugdat=WZlist[i][0]+' - '+WZlist[i][1]
            store.append ([werkzeugdat])
            self.bml.get_widget('comboboxentry1').set_model(store)
        
    def on_comboboxentry_changed(self,entry):
        
         model = self.bml.get_widget('comboboxentry1').get_model()
         iter = self.bml.get_widget('comboboxentry1').get_active_iter()
         print model.get_value(iter, 0)
         """
         var = self.bml.get_widget('comboboxentry').get_child()
         print var
         print entry.get()
         """
g=Geometrie()
Thx mal im Vorraus
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Schau dir doch mal wie das in Revision 21 von seewhatsonair gelöst ist: self.station ist eine Combobox die in StationWindow.__init__ erstellt wird, in StationWindow.populate() mit Inhalt gefüllt wird und in StationWindow.update_click() ausgelesen wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Hier wäre die `W_einlesen()`-Methode etwas "pythonischer":

Code: Alles auswählen

    def W_einlesen(self):
         tools = (('Name', 'Typ'),
                  ('Name2', 'Typ2')
                  ('Name3', 'Typ3')
                  ('Name4', 'Typ4')
                  ('Name5', 'Typ5')
                  ('Name6', 'Typ6')
                  ('Name7', 'Typ7'))
         store = gtk.ListStore(gobject.TYPE_STRING)
         for name, type_ in tools:
             store.append(['%s - %s' % (name, type_)])
         self.bml.get_widget('comboboxentry1').set_model(store)
Das `range()` um dann über den Index auf die einzelnen Elemente zuzugreifen ist umständlicher als direkt über die Elemente zu iterieren.

Und ich nehme mal an das setzen des Modells sollte einmal nach der Schleife passieren und nicht für jeden Eintrag!?
wscharinger
User
Beiträge: 12
Registriert: Freitag 26. Mai 2006, 11:18

Jo hat geschrieben:Hey hab im folgenden Code das Problem das ich nicht auf den ausgewählten Text vom ComboBoxEntry zugreifen. Die Funktion [model.get_value(iter, 0)] liefert mir immer das erste Element. Liegt das Problem vielleicht darin, dass ich das iter beim einlesen setzen sollte?
Oder kann mir wenigstens jemand sagen wie der TreeIter aufgebaut ist,bzw was das genau ist?
Das komische ist das der Iter auch jedes mal einen neuen Wert ausgibt, wodurch ich somit auch nicht über Umwege auf den angewählte Text zugreifen kann. Die Angliederung an ein Glade Projekt macht dies nicht gerade leichter.:(

Thx mal im Vorraus
Hallo,

bin selbst noch ein ziemlicher Anfänger, aber ich versuch's mal, wenn ich Blödsinn verbreite, möge mich jemand verbessern... :-)

In einem Store (Tree- oder ListStore) legst du deine Werte ab.
Das kann eine ein- oder mehrspaltige Liste sein store = gtk.ListStore(str,str,str...).
Die ComboBox ist eine stark vereinfachte Form von TreeView, also eine Möglichkeit, den Store anzuzeigen.
Der Store (als Wertespeicher) und der Tree oder die Box als Anzeige, müssen nun irgendwie miteinander in Verbindung gebracht werden - sprich, ein Wert in der Anzeige muss auf einen Eintrag im Store verweisen und umgekehrt. Da der Anzeigeteil sich dynamisch verändern kann (Sortierung, Umgruppierung durch den User usw.) ist der Wert "1" in der Anzeige nicht automatisch der Wert "1" im Store. Diese Verbindung stellt der Iter (Teil des dazwischenliegenden Treemodels, von dem du nicht viel merkst, das dir aber den ganzen Verwaltungsaufwand abnimmt) her. Ein Iter (Weg) hält also immer einen Zeiger auf den entsprechenden Wert im Store bereit. Jedesmal, wenn sich an der Anzeige etwas ändert (Useraktion oder so), werden die Iter angepasst.

Also nochmal zu deinem Programm:

Code: Alles auswählen

         model = self.bml.get_widget('comboboxentry1').get_model()
         iter = self.bml.get_widget('comboboxentry1').get_active_iter()
         print model.get_value(iter, 0)
Mit model holst du dir also den Zeiger auf dein TreeModel.
Jetzt kannst du dir mit "get_active_iter()" den aktiven iter holen, also den Zeiger auf die Daten der aktiven Zelle.
Da die Zelle jetzt noch mehrere Spalten haben kann (du hast mit "store = gtk.ListStore(gobject.TYPE_STRING)" nur eine angelegt) holst du jetzt mit ".get_value(iter,0)" aus der 1.Spalte und bei dir einzigen Spalte (Python nummeriert immer bei 0 los, also 1.Spalte = 0, 2.Spalte = 1 usw.) den Wert. Mit "get_value(iter,1) würdest du den Wert aus der zweiten Spalte (wenn vorhanden) deines Stores bekommen.

Wenn du immer den ersten Wert der Liste bekommst, hast du eben in der ComboBox noch keinen anderen Wert angeklickt. Wenn du z.B. den dritten Wert anklickst, liefert dir die Funktion den dritten Wert zurück. Oder habe ich da was falsch verstanden?

Hoffe, es ist mir gelungen, den Zusammenhang etwas klarer zu bekommen.
Antworten