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
