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".
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
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
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.
Verfasst: Dienstag 13. September 2005, 20:17
von gerold
So sieht das Beispiel aus wie es sein sollte -- nur leider ohne Suche.
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!
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