Listbox, erste Zeile von Ausgabe markieren

Fragen zu Tkinter.
Antworten
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen

Ich benutze Tkinter und verwende eine Listbox, zur Ausgabe von Datensätzen.
Bisher habe ich mit

Code: Alles auswählen

self.listboxWindow.bind('<<ListboxSelect>>', self.check_chance)
die einzelnen Datensätze ausgewählt, welche dann in einem separaten Fenster ausgegeben werden.

Ich möchte das noch effektiver umgesetzten.

1. Beim Erstellen der Daten in der Listbox, soll die erste Datenzeile schon markiert sein.

2.Weiter möchte ich mit den Richtungstasten Auf und Ab, die Markierung in den Datenzeilen der Listbox bewegen können, um anschließend mit

Code: Alles auswählen

self.listboxWindow.bind('<Double-Button-1>', self.check_chance)
self.listboxWindow.bind('<Return>', self.check_chance)
den gewünschten Datensatz ausgeben zu lassen.

Meine jetzige Funktion dazu sieht so aus:

Code: Alles auswählen

    def listboxDataChance(self, data):
        """Auswahl aus Listbox mit Übergabe zur Datenverarbeitung"""
        self.items = data
        self.listboxWindow.insert(0, *self.items)
        #self.listboxWindow.bind('<<ListboxSelect>>', self.check_chance)
        self.listboxWindow.bind('<Double-Button-1>', self.check_chance)
        self.listboxWindow.bind('<Return>', self.check_chance)
Ich kann zwar jetzt mit Doppleklick oder Return, den gewünschten Datensatz auswählen, jedoch fehlt mir die Lösung um Punkt 1 + 2 umsetzen zu können.

Ich würde mich über Eure Hilfe freuen!

Grüße Nobuddy
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Punkt 1, habe ich gelöst. :)

Code: Alles auswählen

    def listboxDataChance(self, data):
        """Auswahl aus Listbox mit Übergabe zur Datenverarbeitung"""
        self.items = data
        self.listboxWindow.insert(0, *self.items)
        # Vor-Aktivierte Punkte selektieren
        for index in activated:
            self.listboxWindow.selection_set(0)
        #self.listboxWindow.bind('<<ListboxSelect>>', self.check_chance)
        self.listboxWindow.bind('<Double-Button-1>', self.check_chance)
        self.listboxWindow.bind('<Return>', self.check_chance)
Jetzt fehlt nur noch Punk 2, daß ich mit der Markierung durch die auf- und Ab-Richtungstaste verfahren kann.

Vielleicht habt Ihr mir da einen Tip?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Wie ich feststellen mußte, war Punkt 1 noch nicht erledigt.
Die Markierung wurde wie von mir gewünscht zwar auf die erste Datenzeile gesetzt, aber die Datenzeile ließ sich nicht mit dem Event '<Return>' zur Datenausgabe bewegen.
Nach ein bisschen Googeln, bin ich doch einen Schritt weiter gekommen.

Code: Alles auswählen

    def listboxDataChance(self, data):
        """Auswahl aus Listbox mit Übergabe zur Datenverarbeitung"""
        self.items = data
        self.listboxWindow.insert(0, *self.items)
        self.listboxWindow.selection_set(0)
        self.listboxWindow.focus_set()
        self.listboxWindow.bind('<<ListboxSelect>>', self.check_chance)
        self.listboxWindow.bind('<Return>', self.check_chance)
        self.listboxWindow.bind('<Double-Button-1>', self.check_chance)
        if len(data) == 1:
            self.listboxWindow.bind('<FocusIn>', self.check_chance)
Die erste Datenzeile wird markiert und mit dem Setzen des Focus, kann ich nun mit '<Return>' die Datenzeile auswählen.
Weiter habe ich eine Möglichkeit gefunden, wenn nur eine einzige Datenzeile in der Listbox zur Auswahl steht, diese ohne ein '<Return>' ausgeben zu lassen.

Wo ich noch kein Bisschen weiter bin ist Punkt 2, die Markierung mittels den Richtungstasten Up und Down zu bewegen, um andere Datenzeilen auswählen zu können.
Die einzige Möglichkeit, was ich momentan sehe, ist eine Funktion zu schreiben, die mittels der Up- und Down-Taste einen Zähler an 'self.listboxWindow.selection_set(Zähler)' übergibt. Das wäre aber bei größeren Datenmengen ein ziemlicher Rechenaufwand, was sich dann in der Geschwindigkeit der Umsetzung niederschlagen würde.

Ich hoffe, daß Ihr mir da evtl. einen besseren Vorschlag habt?

Grüße Nobuddy
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Habe gehofft von Euch den nötigen Input zu erhalten. :?

Da ich selbst noch keine Lösung für das Bewegen des selektierten Balkens in den Zeilen habe, sieht mein Resultat so aus:

Code: Alles auswählen

    def listboxDataChance(self, data, myfunc):
        """Auswahl aus Listbox mit Übergabe zur Datenverarbeitung"""
        self.items = data
        self.listboxWindow.insert(0, *self.items)
        self.listboxWindow.bind('<<ListboxSelect>>', myfunc)
        #self.listboxWindow.bind('<Return>', myfunc)
        #self.listboxWindow.bind('<KP_Enter>', myfunc)
        #self.listboxWindow.bind('<Double-Button-1>', myfunc)
        if len(data) == 1:
            # Markiere die erste Zeile und setze den Focus darauf
            self.listboxWindow.selection_set(0)
            self.listboxWindow.focus_set()
            self.listboxWindow.bind('<FocusIn>', myfunc)
        # Wenn Taste nicht eingebunden, gebe Tastennamen und -nummer aus.
        self.listboxWindow.bind('<KeyPress>', self.key)


    def key(self, event):
        """Ermittle den Tastennamen und -nummer"""
        print('Symbolischer Namen der Taste: <%s> \
\nTasten-Identifier: %s' % (event.keysym, event.keycode))
        return event.keysym
Gibt es für mein Vorhaben keine Lösung?
Antworten