Seite 1 von 1

Auswahl in dynamischen Listboxen

Verfasst: Mittwoch 19. Dezember 2018, 07:44
von headhunter1978
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()

Re: Auswahl in dynamischen Listboxen

Verfasst: Mittwoch 19. Dezember 2018, 18:12
von wuf
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 :-)

Re: Auswahl in dynamischen Listboxen

Verfasst: Mittwoch 19. Dezember 2018, 18:57
von Sirius3
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.

Re: Auswahl in dynamischen Listboxen

Verfasst: Donnerstag 20. Dezember 2018, 11:23
von headhunter1978
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.

Re: Auswahl in dynamischen Listboxen

Verfasst: Donnerstag 20. Dezember 2018, 11:38
von headhunter1978
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. :)