Seite 1 von 1

GTK SimpleList (Einfache Listbox mit GTK)

Verfasst: Donnerstag 8. September 2005, 13:48
von gerold
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
:-)

Verfasst: Donnerstag 8. September 2005, 14:15
von mitsuhiko
Fein. Ich krieg immer Krämpfe, wenn ich ListViews in gtk erstellen muss.
Dafür kann man schweineviel damit anstellen ;-)

Dankeschön :D

Verfasst: Donnerstag 8. September 2005, 17:00
von Leonidas
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 :)

Verfasst: Dienstag 13. September 2005, 20:10
von gerold
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
:-)

Verfasst: Dienstag 13. September 2005, 20:16
von gerold
So sieht das Beispiel aus, wie es nicht sein sollte.

Bild

Verfasst: Dienstag 13. September 2005, 20:17
von gerold
So sieht das Beispiel aus wie es sein sollte -- nur leider ohne Suche.

Bild

Verfasst: Mittwoch 6. Juni 2007, 19:55
von mx
kann man simplelist auch in einem glade projekt benutzen? sorry, bin noch ein ziemlicher Anfänger und blick da leider nicht ganz durch

Verfasst: Mittwoch 23. Januar 2008, 21:05
von Dauerbaustelle
@mx:
Klar,
self.gladetree.get_widget("box-wo-das-reinsoll").pack_start(SimpleList(), True, True,0)

Verfasst: Donnerstag 24. Januar 2008, 18:28
von mx
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