Auswahl in dynamischen Listboxen

Fragen zu Tkinter.
Antworten
headhunter1978
User
Beiträge: 20
Registriert: Sonntag 18. November 2018, 11:15

Hallo zusammen,

könnt ihr mir bitte mit folgenden Problem vielleicht:

Ich habe zwei Listboxen (Listbox1 und Listbox2), deren Inhalte über eine Datenbank geladen werden. Zuerst werden die Inhalte der linken Box (Listbox1) geladen. Die Inhalte der zweiten Box (Listbox2) werden in Abhängigkeit der in der ersten Box ausgewählten Elemente nachgeladen.

Wenn ich in der zweiten Box jetzt Elemente auswählen, wird die zweite Listbox (Listbox2) geleert. Es scheint so, als ob Listbox2, wenn man dort rein klickt, die Funktion 'OnSelect' ausführt. Eigentlich soll nur die Funktion 'OnSelect2' ausgeführt werden. Kann man das irgendwie verhindern?

Vielen Dank für euere Unterstützung.

Code: Alles auswählen

import tkinter as tk
from database import *

class gui(tk.Tk):

    def __init__(self):
        self.HPG = Abfrage_HPG().menu
        self.cache = []

        tk.Tk.__init__(self)
        tk.Tk.title(self, 'TSI-Tool')
        tk.Tk.geometry(self, '435x160')

        # Rahmen Listbox1
        frameListbox0 = tk.Frame(self)
        frameListbox0.place(x=5, y=35, width=220, height=80)

        # Rahmen Listbox2
        frameListbox1 = tk.Frame(self)
        frameListbox1.place(x=220, y=35, width=220, height=80)

        # Listbox0
        self.listboxNamen0 = tk.Listbox(frameListbox0, selectmode='multiple')
        for item in self.HPG:
            self.listboxNamen0.insert('end', item)
        self.listboxNamen0.bind('<<ListboxSelect>>', self.OnSelect)
        self.listboxNamen0.place(x=5, y=10, width=200, height=70)

        # Listbox1
        self.listboxNamen1 = tk.Listbox(frameListbox1, selectmode='multiple')
        self.listboxNamen1.bind('<<ListboxSelect>>', self.OnSelect2)
        self.listboxNamen1.place(x=5, y=10, width=200, height=70)

        #Button
        self.buttonVerarbeiten = tk.Button(text='Abfrage starten', command=self.buttonVerarbeitenClick)
        self.buttonVerarbeiten.place(x=8, y=120, width=120, height=20)

    def OnSelect(self, event):
        print('OnSelect1')
        listeAusgewaehlt = self.listboxNamen0.curselection()
        self.listboxNamen1.delete(0, 'end')
        self.cache = []

        auswahl = []
        for item in listeAusgewaehlt:
            auswahl.append(str(self.HPG[item]).split(' ')[0])
        self.build_query(auswahl)

    def OnSelect2(self, event):
        print('OnSelect2')
        print(self.cache)


    def build_query(self, auswahl):
        temp_query = ''
        for item in auswahl:
            temp_query = temp_query + 'Schlagworte_HPG.Abkuerzung_HPG=\"' + str(item) + '\" OR '

        if temp_query != '':
            temp_query = temp_query[:-3]

            self.UPG = Abfrage_UPG(temp_query).menu
            for item in self.UPG:
                self.listboxNamen1.insert('end', item)
                self.cache.append(item)
            print(self.cache)

    def buttonVerarbeitenClick(self):
        print(self.cache)

if __name__ == "__main__":
    app = gui()
    app.mainloop()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi headhunter1978

Kannst du einmal folgendes ausprobieren?:

Code: Alles auswählen

    def OnSelect(self, event):
        print('OnSelect1')
        listeAusgewaehlt = self.listboxNamen0.curselection()
        #self.listboxNamen1.delete(0, 'end')
        self.cache = []

        auswahl = []
        for item in listeAusgewaehlt:
            auswahl.append(str(self.HPG[item]).split(' ')[0])
        self.build_query(auswahl)

Code: Alles auswählen

    def build_query(self, auswahl):
        temp_query = ''
        for item in auswahl:
            temp_query = temp_query + 'Schlagworte_HPG.Abkuerzung_HPG=\"' + str(item) + '\" OR '

        if temp_query != '':
            temp_query = temp_query[:-3]
            self.listboxNamen1.delete(0, 'end')
            self.UPG = Abfrage_UPG(temp_query).menu
            for item in self.UPG:
                self.listboxNamen1.insert('end', item)
                self.cache.append(item)
            print(self.cache)
Gruss wuf :-)
Take it easy Mates!
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist denn der Inhalt von HPG? OnSelect1 wird aufgerufen, wenn sich die Selection von ListboxNamen0 ändert, also auch, wenn der Fokus von ListboxNamen0 auf ListboxNamen1 ändert. Das sind übrigens alles schlechte Variabelnamen, wenn man anfängt, Nummern an Namen zu hängen, dann sollte man sich bessere Namen ausdenken.
Was steht denn in `datenbank`? Die Abfrage seht stark danach aus, als ob das SQL wäre und man darf keine Parameter direkt mit + in den Ausdruck hineinzustückeln. Benutze Platzhalter.
headhunter1978
User
Beiträge: 20
Registriert: Sonntag 18. November 2018, 11:15

Sirius3 hat geschrieben: Mittwoch 19. Dezember 2018, 18:57 Was ist denn der Inhalt von HPG? OnSelect1 wird aufgerufen, wenn sich die Selection von ListboxNamen0 ändert, also auch, wenn der Fokus von ListboxNamen0 auf ListboxNamen1 ändert. Das sind übrigens alles schlechte Variabelnamen, wenn man anfängt, Nummern an Namen zu hängen, dann sollte man sich bessere Namen ausdenken.
Was steht denn in `datenbank`? Die Abfrage seht stark danach aus, als ob das SQL wäre und man darf keine Parameter direkt mit + in den Ausdruck hineinzustückeln. Benutze Platzhalter.
Die Variablen sind wirklich noch nicht optimal. Die Inhalte kommen aus einer SQL-Datenbank.
headhunter1978
User
Beiträge: 20
Registriert: Sonntag 18. November 2018, 11:15

wuf hat geschrieben: Mittwoch 19. Dezember 2018, 18:12 Hi headhunter1978

Kannst du einmal folgendes ausprobieren?:

Code: Alles auswählen

    def build_query(self, auswahl):
        temp_query = ''
        for item in auswahl:
            temp_query = temp_query + 'Schlagworte_HPG.Abkuerzung_HPG=\"' + str(item) + '\" OR '

        if temp_query != '':
            temp_query = temp_query[:-3]
            self.listboxNamen1.delete(0, 'end')
            self.UPG = Abfrage_UPG(temp_query).menu
            for item in self.UPG:
                self.listboxNamen1.insert('end', item)
                self.cache.append(item)
            print(self.cache)
Gruss wuf :-)
Super. das war die Lösung. Danke schön. :)
Antworten