GTK SimpleList (Einfache Listbox mit GTK)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Weil ich faul bin habe ich mir ein "gtkhelper"-Modul erstellt. In diesem Modul entsteht immer wieder mal eine neue Klasse, die mir das Leben mit GTK als Programmierer erleichtert. Ein Auszug daraus ist "SimpleList".

Bild

SimpleList erstellt schlicht und einfach nur eine "TreeView"-Liste in einem "ScrolledWindow". Wer das schon einmal gemacht hat, weiß, dass man im GTK nicht einfach nur eine Liste erstellen kann. Man braucht normalerweise mindestens ein TreeView, eine TreeViewCell, eine TreeViewColumn und ein ListView.

SimpleList kümmert sich um dieses Drumherum und stellt ein einziges Objekt zur Verfügung.

Mit dem Befehl "append_item()" wird eine neu Zeile hinzugefügt und mit "get_selection_data()" wird die selektierte Zeile zurück gegeben.

Hier geht es zur SimpleList-Seite: http://gerold.bcom.at/python/python_cod ... mple_list/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Fein. Ich krieg immer Krämpfe, wenn ich ListViews in gtk erstellen muss.
Dafür kann man schweineviel damit anstellen ;-)

Dankeschön :D
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

blackbird hat geschrieben:Fein. Ich krieg immer Krämpfe, wenn ich ListViews in gtk erstellen muss.
Dafür kann man schweineviel damit anstellen ;-)
Ja, man kann damit gut Arbeiten wenn man erst das Konzept dahinter verstanden hat. Ich habe es einmal Verstanden und wieder vergessen ;)

Sehr praktisch dein Code :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Ich habe ein Problem (siehe unterhalb des Codes) mit diesem Code, der eine GTK-Liste anzeigt.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import pygtk
pygtk.require("2.0")
import gtk


#----------------------------------------------------------------------
class SimpleList(gtk.ScrolledWindow):
    """
    Stellt eine einfache Liste mit Laufbalken dar. Das wird mit
    den Objekten ScrolledWindow und TreeView erreicht.
    """

    #----------------------------------------------------------------------
    def append_item(self, value, key = ""):
        """
        Fügt der Liste Werte und wenn gewünscht, Schlüssel hinzu.
        """

        self.list_store.append([key, value])


    #----------------------------------------------------------------------
    def _cursor_changed(self, widget):
        """
        Setzt den Wert von self.selected_items. Dieser Wert kann
        mit der Methode "get_selection_data".
        """

        selection = widget.get_selection()

        (model, iter) = selection.get_selected()
        self.selected_item = (
            int(selection.get_selected_rows()[1][0][0]), # Position
            str(model.get_value(iter, 0)), # Key
            str(model.get_value(iter, 1)) # Value
        )


    #----------------------------------------------------------------------
    def get_selection_data(self):
        """
        Gibt die Variable self.selected_item zurück.
        Diese enthält ein Tupel. (<Position>, <Key>, <Value>)
        """

        return self.selected_item  # (<Position>, <Key>, <Value>)


    #----------------------------------------------------------------------
    def set_eventfunction__cursor_changed(self, function):
        """
        Verbindet die übergebene Funktion mit dem
        Signal "cursor-changed".
        """

        self.tree_view.connect("cursor-changed", function)


    #----------------------------------------------------------------------
    def __init__(self):
        """
        Initialisieren
        """

        gtk.ScrolledWindow.__init__(self)
        self.selected_item = None # (<Position>, <Key>, <Value>)

        # Liste
        self.list_store = gtk.ListStore(str, str)

        # ScrolledWindow
        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        #self.set_border_width(6)
        self.set_shadow_type(gtk.SHADOW_IN)

        # Treeview
        self.tree_view = gtk.TreeView(self.list_store)
        self.tree_view.set_headers_visible(False)
        self.tree_view.connect("cursor-changed", self._cursor_changed)
        self.tree_view.show()

        # Key-Spalte hinzufügen
        self.key_cell = gtk.CellRendererText()
        self.key_column = gtk.TreeViewColumn("Key")
        self.key_column.pack_start(self.key_cell, True)
        self.key_column.add_attribute(self.key_cell, "text", 0)
        self.key_column.set_visible(False)
        self.tree_view.append_column(self.key_column)

        # Value-Spalte hinzufügen
        self.value_cell = gtk.CellRendererText()
        self.value_column = gtk.TreeViewColumn("Caption")
        self.value_column.pack_start(self.value_cell, True)
        self.value_column.add_attribute(self.value_cell, "text", 1)
        self.tree_view.append_column(self.value_column)

        # Suchspalte setzen
        self.tree_view.set_search_column(1)

        # Anzeigen
        self.add(self.tree_view)
        self.show()


#----------------------------------------------------------------------
def main():
    """
    Testfunktion
    """

    # Fenster erstellen
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.set_title("SimpleList")
    window.set_default_size(180, 100)
    window.connect("destroy", gtk.main_quit)

    # SimpleList erstellen und dazugehöriges Event verbinden
    simple_list = SimpleList()

    def cursor_changed(*args):
        print "(pos, key, value) =", simple_list.get_selection_data()

    simple_list.set_eventfunction__cursor_changed(cursor_changed)

    # SimpleList befüllen
    simple_list.append_item("Erster Wert", "eins")
    simple_list.append_item("Zweiter Wert (ohne Key)")
    simple_list.append_item("Dritter Wert", "drei")
    simple_list.append_item("Vierter Wert")
    simple_list.append_item(u"Fünfter Wert")
    simple_list.append_item("Sechster Wert")

    # Anzeigen
    window.add(simple_list)
    window.show()
    gtk.main()


if __name__ == "__main__":
    main()
Wenn ich mit STRG+F oder einfach nur durch tippen eines Buchstaben in den Suchmodus wechsle und mit diesem einen Wert auswähle, dann wird der gewählte Eintrag nicht automatisch an das TreeViewSelection-Objekt weiter gegeben.

Es ist zwar optisch eine Zeile ausgewählt und wie gewohnt blau hinterlegt, lässt sich aber nicht mit

Code: Alles auswählen

selection = widget.get_selection()
(model, iter) = selection.get_selected()
oder

Code: Alles auswählen

selection.get_selected_rows()
abrufen.
Erst, wenn man zusätzlich mit der Maus auf die blau hinterlegte Zeile klickt, dann wird die Zeile so ausgewählt, dass man Sie abfragen kann.

Weiß jemand einen Workaround?

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

So sieht das Beispiel aus, wie es nicht sein sollte.

Bild
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

So sieht das Beispiel aus wie es sein sollte -- nur leider ohne Suche.

Bild
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mx
User
Beiträge: 23
Registriert: Donnerstag 4. August 2005, 15:29
Kontaktdaten:

kann man simplelist auch in einem glade projekt benutzen? sorry, bin noch ein ziemlicher Anfänger und blick da leider nicht ganz durch
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

@mx:
Klar,
self.gladetree.get_widget("box-wo-das-reinsoll").pack_start(SimpleList(), True, True,0)
mx
User
Beiträge: 23
Registriert: Donnerstag 4. August 2005, 15:29
Kontaktdaten:

wow... hab nicht erwartet nach der Zeit noch eine Antwort zu bekommen! :D

vielen dank, ich werds auf jeden fall ausprobieren wenn ich mal zeit hab... das projekt für das ich simplelist bruchte ist auf jedenfal schon seit meinem letzten post nicht mehr weiterentwickelt worden ....

schönen tag noch,
mx
Antworten