Jupyter Notebook Dropdown Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Ich möchte gerne mit zwei Dropdown Listen arbeiten. Wenn ich bei der oberen Liste einen Eintrag anwähle soll die untere Liste aktualisiert werden.
Mein Code unter Jupyter Notebook:

Code: Alles auswählen

import ipywidgets as widgets
from ipywidgets import Button, Layout# dies braucht für grösse des Feldes
from IPython.display import display

Welche_Kiste =[
        "Kiste 1",
        "Kiste 2",
        "Kiste 3"
]

Text_options = Welche_Kiste
    
Text_Liste = widgets.Dropdown(description="Kiste", options=Text_options,layout=Layout(width='21%', height='30px'))
            
display(Text_Liste)

print(f' Die {Text_Liste.value} enthält:')

if Text_Liste.value == "Kiste 1":

    inhalt =[
            "Apfel",
            "Melone",
            "Zitrone"
    ]

elif Text_Liste.value == "Kiste 2":
    inhalt =[
            "Kartoffel",
            "Tomaten",
            "Ruebli"
    ]

elif Text_Liste.value == "Kiste 3":
    inhalt = [
            "Mehl",
            "Zucker",
            "Salz"
    ]

Text_options = inhalt
    
Text_inhalt = widgets.Dropdown(description="Inhalt", options=Text_options,layout=Layout(width='21%', height='30px'))
display(Text_inhalt)
Hat jemand eine Idee?
Gruss
Werner
karolus
User
Beiträge: 144
Registriert: Samstag 22. August 2009, 22:34

Hallo

Code: Alles auswählen

import ipywidgets as widgets
from ipywidgets import Button, Layout# dies braucht für grösse des Feldes
from IPython.display import display


kisten ={
        "Kiste 1": ["Apfel", "Melone", "Zitrone"],
        "Kiste 2": ["Kartoffel","Tomaten","Rübli"],
        "Kiste 3": ["Mehl","Zucker","salz"]
        }
    
Liste = widgets.Dropdown( description="Kiste", options=kisten, layout=Layout(width='21%', height='30px'))
            
display(Liste)



###
print( Liste.label )    ## tada
###

inhalt = widgets.Dropdown( description="Inhalt",  options=kisten[ Liste.label ], layout=Layout(width='21%',  height='30px'))

display(inhalt)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du auf eine Änderung reagieren willst, mußt Du auf die Änderung horchen:

Code: Alles auswählen

import ipywidgets as widgets
from IPython.display import display
from functools import partial

kisten = {
    "Kiste 1": ["Apfel", "Melone", "Zitrone"],
    "Kiste 2": ["Kartoffel", "Tomaten", "Rübli"],
    "Kiste 3": ["Mehl", "Zucker", "Salz"],
}

def on_change(dropdown, change):
    if change["name"] == "value":
        dropdown.options = change["new"]

kiste = widgets.Dropdown(description="Kiste", options=kisten)
inhalt = widgets.Dropdown(description="Inhalt", options=kiste.value)
kiste.observe(partial(on_change, inhalt))
display(kiste, inhalt)
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Herzlichen Dank an Sirius3 so funktioniert der Code.
Werner
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Jetzt möchte ich gerne aus einer Datei in welchem die Kisten gespeichert sind und aus einer Datei die Inhalte auslesen.
Die Dateien sehen folgendermassen aus
Kisten.txt
Kiste_1
Kiste_2

Kiste_1_Inhalt.txt
Apfel
Bannane
Kiste_2_Inhalt.txt
Milch
Bier

Code: Alles auswählen

import ipywidgets as widgets
from IPython.display import display
from functools import partial

# Einlesen was für Kisten vorhanden sind
with open("Kisten.txt", "r", encoding="utf-8") as Datei_1: 
    for lesen_kb in Datei_1:
        
        # Einlesen was in der Kiste ist
        with open(lesen_kb.replace('\n', '')+"_Inhalt.txt", "r", encoding="utf-8") as Datei_2:
            inhalt = []
 
            for produkt in Datei_2:
                # Zeilenumbrüche entfernen
                produkt = produkt.replace('\n', '')
                # nur Wörter (keine leeren Strings) zur Liste hinzufügen
                if produkt:
                    inhalt.append(produkt)
            kistenummer=lesen_kb.replace('\n', '')
            
            kisten={}          
            kisten= (f'"{kistenummer}":{inhalt},')
            print(kisten)


def on_change(dropdown, change):
    if change["name"] == "value":
        dropdown.options = change["new"]

welchekiste = widgets.Dropdown(description="Welche Kiste", options=kisten)
inhalt = widgets.Dropdown(description="Inhalt", options=welchekiste.value)
welchekiste.observe(partial(on_change, inhalt))
display(welchekiste, inhalt)
Der Print ergibt:
"Kiste_1":['Apfel', 'Banane'],
"Kiste_2":['Milch', 'Bier'],

Die zwei Dropdown Element zeigen jedoch je nur ein Zeichen.
Was mache ich jetzt wieder falsch?
Gruss Werner
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen schreibt man komplett klein. Was soll das kb bei lesen_kb bedeuten?
Statt replace benutzt man hier rstrip oder strip.
kisten wird erst als leeres Wörterbuch initialisierst, dann aber gleich mit einem String überschrieben, der seltsam aussieht. Was übrig bleibt ist dieser String für die letzte Kiste.
Du willst aber eine Datenstruktur für alle Kisten aufbauen. Dazu definierst Du am Anfang das Wörterbuch und füllst es mit inhalt.
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Mit diesem Code gehts nun, lieder bekomme ich nur die Letzte Kiste Angezeigt.
Hast Du mir noch einen Tipp?

Code: Alles auswählen

import ipywidgets as widgets
from IPython.display import display
from functools import partial

# Einlesen was für Kisten vorhanden sind
with open("Kisten.txt", "r", encoding="utf-8") as datei_1: 
    for lesen in datei_1:
        
        # Einlesen was in der Kiste ist  / strip = Leerzeichen entfernen
        with open(lesen.strip()+"_Inhalt.txt", "r", encoding="utf-8") as datei_2:

        #with open(lesen_kb..strip()+"_Inhalt.txt", "r", encoding="utf-8") as Datei_2:
            inhalt = []
 
            for produkt in datei_2:
                # Zeilenumbrüche entfernen
                produkt = produkt.strip()
                # nur Wörter (keine leeren Strings) zur Liste hinzufügen
                if produkt:
                    inhalt.append(produkt)
                    #strip = Leerzeichen entfernen
                    kistenummer=lesen.strip()

            kisten = {}           
            kisten[kistenummer] = inhalt
            print(kisten)


            def on_change(dropdown, change):
                if change["name"] == "value":
                    dropdown.options = change["new"]

welchekiste = widgets.Dropdown(description="Welche Kiste", options=kisten)
inhalt = widgets.Dropdown(description="Inhalt", options=welchekiste.value)
welchekiste.observe(partial(on_change, inhalt))
display(welchekiste, inhalt)
Gruss Werner
karolus
User
Beiträge: 144
Registriert: Samstag 22. August 2009, 22:34

WvonRiedi hat geschrieben: Sonntag 15. August 2021, 14:25 Mit diesem Code gehts nun, lieder bekomme ich nur die Letzte Kiste Angezeigt.
Hast Du mir noch einen Tipp?
Du initialisierst kisten = {} an der falschen Stelle

Code: Alles auswählen

import ipywidgets as widgets
from IPython.display import display
from functools import partial



kisten = {}
# Einlesen was für Kisten vorhanden sind
with open("Kisten.txt", "r", encoding="utf-8") as datei_1: 
    for lesen in datei_1:
        
        # Einlesen was in der Kiste ist  / strip = Leerzeichen entfernen
        with open(lesen.strip()+"_Inhalt.txt", "r", encoding="utf-8") as datei_2:

        #with open(lesen_kb..strip()+"_Inhalt.txt", "r", encoding="utf-8") as Datei_2:
            inhalt = []
 
            for produkt in datei_2:
                # Zeilenumbrüche entfernen
                produkt = produkt.strip()
                # nur Wörter (keine leeren Strings) zur Liste hinzufügen
                if produkt:
                    inhalt.append(produkt)
                    #strip = Leerzeichen entfernen
                    kistenummer=lesen.strip()

                       
            kisten[kistenummer] = inhalt
print(kisten)


def on_change(dropdown, change):
    if change["name"] == "value":
        dropdown.options = change["new"]

welchekiste = widgets.Dropdown(description="Welche Kiste", options=kisten)
inhalt = widgets.Dropdown(description="Inhalt", options=welchekiste.value)
welchekiste.observe(partial(on_change, inhalt))
display(welchekiste, inhalt)
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Super!!
Herzlichen Dank für die schnelle Antwort .
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Hallo, schon wieder stehe ich an.
Ich möchte den Wert der in welchekiste = widgets.Dropdown aktiv ist einer Variablen zuteilen.
variable_a = (welchekiste = widgets.Dropdown aktiv)

Habe alles mögliche versucht, jedoch kein erfolg gehabt. Nehme mal an das irgendwie das Schlüsselwort "Key" dabei sein muss.


variable_b = (inhalt = widgets.Dropdown aktiv)
Diesen Wert erhalte ich durch

Code: Alles auswählen

variable_b = inhalt.value
Herzlichen Dank für die Geduld
Gruss Werner
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

welche_kiste.label
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

:P Nochmals Herzlichen Dank
Antworten