Dropdown menü deaktivieren

Fragen zu Tkinter.
Marvin75854

__deets__ hat geschrieben: Freitag 10. August 2018, 10:02 Dazu benutzt man ein Wörterbuch. Das bildet Optionen auf Klassen oder Funktionen ab. Wenn eine neue Klasse dazu kommt, dann muss die nur in das Wörterbuch eingetragen werden. Und um die Reihenfolge zu definieren, benutzt man ein OrderedDict.
Habe mal ein bisschen guckt. Ist es nicht so, dass ich in einem Wörterbuch der Variablen Dummy_1 quasi den Namen "H395" zuweise. Ich will aber ja dass, Dummy_1 über die GUI mit einem DropdownMenu ausgewählt werden soll. Das heißt ich habe ein DropdownMenu mit 5 Auswahlmöglichkeiten und will dann dementsprechend die richtige Klasse aufrufen. Ist die Reihenfolge nicht egal? Ich kann mit der Reihenfolge ja bestimmte Elemente im Wörterbuch aufrufen. Ich weiß aber ja vorher nicht, welche Auswahl ich auf der GUI treffe und dementsprechend auch nicht an welcher Stelle das im Wörterbuch steht.

Es ist ja so, dass ich etwas auswähle was dann unter Dummy_1 hinterlegt ist. Das Funktioniert perfekt. Auch bei Print(Dummy_1) gibt er mir dann ganz normal den Inhalt aus, also z.b. "H395" aus. Ist es nicht irgendwie möglich, dass bei dem Klassenaufruf "x = Dummy_1 (...)" auch der Inhalt, also "H395" anstatt von dem eigentlichen Wort "Dummy_1" beachtet wird?
Ich kann "Dummy_1" ja nicht fest den Audruck "H395", weil er ja flexibel sein soll und eben auf der GUI ausgewählt wird
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Wörterbuch bildet Dropdown-Optionen auf die Klasse (nicht deren NAMEN) ab.

Code: Alles auswählen

sauna_options = { 
     “finnisch” : FinnishSaunaClass,
     “rauch” : RauchSauna,
}
Deine Auswahl-Variable Dummy_1 (ganz mieser Name übrigens) beihnaltet dann eben einen der Schlüssel. Und wenn der Benutzer “Los geht’s “ drückt, wird eben die Klasse nachgeschlagen & erzeugt:

Code: Alles auswählen

sauna_options[Dummy_1.get()]()
Marvin75854

__deets__ hat geschrieben: Freitag 10. August 2018, 11:20 Das Wörterbuch bildet Dropdown-Optionen auf die Klasse (nicht deren NAMEN) ab.

Code: Alles auswählen

sauna_options = { 
     “finnisch” : FinnishSaunaClass,
     “rauch” : RauchSauna,
}
Deine Auswahl-Variable Dummy_1 (ganz mieser Name übrigens) beihnaltet dann eben einen der Schlüssel. Und wenn der Benutzer “Los geht’s “ drückt, wird eben die Klasse nachgeschlagen & erzeugt:

Code: Alles auswählen

sauna_options[Dummy_1.get()]()
Ah ok. Habe das ganze jetzt mal getestet und es klappt

Code: Alles auswählen


GUI = tx.Tk()
GUI.title ("COG Tool") 
GUI.geometry("1800x800")

choicesD = ('SID-IIs',"H395")  

Dummy_1 = StringVar(GUI)
Dummy_1.set("H395")
popupMenuD1 = OptionMenu(GUI, Dummy_1, *choicesD)
popupMenuD1.grid(row=1, column=0)

class H395:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def calc(self):
        return(self.x+self.y)

class SIDIIs:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def calc(self):
        return(self.x*self.y)

Dummy_options = {"H395" : H395,
                 "SID-IIs" : SIDIIs
}
def test():
    x = Dummy_options[Dummy_1.get()](5, 5)
    print(x.calc())

button = Button(GUI, text= "test", command=test).grid(row=0, column=0)

GUI.mainloop()
Ja das mit den Namen wurde hier schon einige male erwähnt :D Meine Namen sind auch wirklich suboptimal. In diesem Fall handelt es sich aber tatsächlich um einen Dummy der in Crashsimulationen eingesetzt wird. H395 und SIDIIs usw. sind dann Versionen von Dummys. und _1 einfach nur weil ich 4 Dummys übergeben muss um daraus ein Trefferfeld zu erzeugen.
Vielen Dank. Das mit dem Wörterbuch kann mir vielleicht sogar noch an anderen Stellen helfen.
Antworten