Seite 1 von 1

Wie kann man auf den Text in einer ComboBoxEntry zugreifen ?

Verfasst: Donnerstag 9. November 2006, 16:09
von Jo
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

Verfasst: Donnerstag 9. November 2006, 16:24
von Leonidas
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.

Verfasst: Donnerstag 9. November 2006, 16:51
von 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!?

Re: Wie kann man auf den Text in einer ComboBoxEntry zugreif

Verfasst: Dienstag 14. November 2006, 10:56
von wscharinger
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.