StringVar in Listen/Arrays -> Radiobuttons
Verfasst: Dienstag 31. Oktober 2017, 18:36
Hallo zusammen,
ich habe eine Problem und ich habe jetzt Stunden im Netz verbracht um eine Lösung zu finden. Entweder habe ich die falschen Suchbegriffe oder ich bin einfach festgefahren.
Ob die Überschrift 100% richtig ist, weiß ich auch nicht.
Was möchte ich?
-> Ich habe eine Liste von Sensoren (in einem 2D Array), die ich in einem Fenster auflisten möchte und über Radiobuttons eine Zuordnung an Positionen durchführen möchte. Pro Sensor soll nur eine Position möglich sein, also eine von 1 bis 4.
Das sieht wie folgt aus:
Die Liste der Sensoren ist dynamisch, es können also 2 Sensoren sein oder 10 oder mehr sein. Meine grafische Anzeige läuft als Thread, da ich im Hauptprogramm Sensordaten vom System abgreife und in eine Liste verpacke und diese auch aktualisiere. Das funktioniert auch sehr gut.
Wenn ich also die Radiobuttons des Sensors 1 bündeln möchte mache ich das wie folgt:
Um nun für jeden Sensor eine Zeile zu spendieren, erzeuge ich den Variablennamen dynamisch, was vielleicht nicht sehr schick ist, aber mir ist nichts besseres eingefallen. Dazu läuft eine Schleife, bis die Liste in meinem Fenster vollständig abgebildet ist.
Die Empfehlung in verschiedenen Foren war, dass man die StringVar-Variablen in ein Array packt.
Was der Code macht:
Ich kann die nun die Radiobuttons nun einer Zeile zuordnen -> Klappt, ich kann pro Zeile nur eine Position anklicken.
Was der Code nicht macht:
Wenn ich einen Radiobutton klicke, soll eine Funktion aufgerufen werden und dort der Wert der Zeile erfasst werden.
Und da liegt das Problem. Ich kann den Wert eines Radiobuttons nicht auslesen.
Was der Code machen soll:
Ich möchte immer wenn ein Radiobutton geklickt wird, den Wert von "value" und den Indexwert von "self.pos" haben und in der Funktion entsprechend verarbeiten.
Ich habe im Netz eine Lösung gefunden, die allerdings nur bei der letzten Zeile geht. Das liegtwahrschienlich daran, dass mit dem Parameter "-1" immer das letzte Element des Arrays ausgegeben wird.
Mein Problem ist, dass ich nicht auf alle Zeilen und den Wert zugreifen kann. Vielleicht ist es auch ganz einfach, aber ich komme einfach nicht drauf. Man muss dazu sagen, dass ich Python seit ca. 3 Wochen erlerne und mein "Können" aus Büchern und dem Internet beziehe.
Sollte mein Programmierstil grottig sein, dann könnt Ihr mir das gerne sagen, ich möchte ja besser werden.
Könnt Ihr mir vielleicht einen Schubs geben, damit ich in die richtige Richtung weiter machen kann?
Danke und Gruß
Malte
ich habe eine Problem und ich habe jetzt Stunden im Netz verbracht um eine Lösung zu finden. Entweder habe ich die falschen Suchbegriffe oder ich bin einfach festgefahren.
Ob die Überschrift 100% richtig ist, weiß ich auch nicht.
Was möchte ich?
-> Ich habe eine Liste von Sensoren (in einem 2D Array), die ich in einem Fenster auflisten möchte und über Radiobuttons eine Zuordnung an Positionen durchführen möchte. Pro Sensor soll nur eine Position möglich sein, also eine von 1 bis 4.
Das sieht wie folgt aus:
Code: Alles auswählen
Sensorname: Pos 1 Pos 2 Pos 3 Pos4
Sensor 1 [ ] [ ] [ ] [ ]
Sensor 2 [ ] [ ] [ ] [ ]
Sensor 3 [ ] [ ] [ ] [ ]
Sensor 4 [ ] [ ] [ ] [ ]
...
Wenn ich also die Radiobuttons des Sensors 1 bündeln möchte mache ich das wie folgt:
Code: Alles auswählen
sensor1 = StringVar()
...
rb1 = tk.Radiobutton(self.posfenster, text="0", variable=sensor1 value="pos0")
rb2 = tk.Radiobutton(self.posfenster, text="1", variable=sensor1 value="pos1")
rb3 = tk.Radiobutton(self.posfenster, text="2", variable=sensor1 value="pos2")
rb4 = tk.Radiobutton(self.posfenster, text="3", variable=sensor1 value="pos3")
...
Die Empfehlung in verschiedenen Foren war, dass man die StringVar-Variablen in ein Array packt.
Code: Alles auswählen
...
self.elementzaehler = 1 # bewusst bei 1, denn an Position 0 stehen andere Infos
while self.elementzaehler <= int(beispiel.get_count()): # Anzahl der Sensoren wird in Klasse "beispiel" bestimmt
# - Holt alle Elemente aus der Sensorliste und platziert den Sensornamen
self.gui_sensordaten = beispiel.lesen(self.elementzaehler) # die Sensordaten sind in einem 2D Array gespeichert
self.t = tk.Label(self.posfenster, text=self.gui_sensordaten[0]) # die Sensordaten sind ebenfalls in einem Array, Element 0 ist der Name
self.t.grid(row=self.elementzaehler+2, column=0) # Offset für Platzierung
self.test = StringVar()
self.pos.append(self.test) # Packt "StringVar" in eine Liste
self.rb1 = tk.Radiobutton(self.posfenster, text="0", variable=self.pos[-1], value="pos0", command=self.funktion))
self.rb1.grid(row=self.elementzaehler+2, column=2)
self.rb2 = tk.Radiobutton(self.posfenster, text="1", variable=self.pos[-1], value="pos1", command=self.funktion))
self.rb2.grid(row=self.elementzaehler+2, column=3)
self.rb3 = tk.Radiobutton(self.posfenster, text="2", variable=self.pos[-1], value="pos2", command=self.funktion))
self.rb3.grid(row=self.elementzaehler+2, column=4)
self.rb4 = tk.Radiobutton(self.posfenster, text="3", variable=self.pos[-1], value="pos3", command=self.funktion))
self.rb4.grid(row=self.elementzaehler+2, column=5)
self.elementzaehler += 1
...
Ich kann die nun die Radiobuttons nun einer Zeile zuordnen -> Klappt, ich kann pro Zeile nur eine Position anklicken.
Was der Code nicht macht:
Wenn ich einen Radiobutton klicke, soll eine Funktion aufgerufen werden und dort der Wert der Zeile erfasst werden.
Und da liegt das Problem. Ich kann den Wert eines Radiobuttons nicht auslesen.
Was der Code machen soll:
Ich möchte immer wenn ein Radiobutton geklickt wird, den Wert von "value" und den Indexwert von "self.pos" haben und in der Funktion entsprechend verarbeiten.
Ich habe im Netz eine Lösung gefunden, die allerdings nur bei der letzten Zeile geht. Das liegtwahrschienlich daran, dass mit dem Parameter "-1" immer das letzte Element des Arrays ausgegeben wird.
Code: Alles auswählen
self.rb1 = tk.Radiobutton(self.posfenster, text="0", variable=self.pos[-1], value="pos0", command=lambda:self.funktion(self.pos[-1].get()))
Sollte mein Programmierstil grottig sein, dann könnt Ihr mir das gerne sagen, ich möchte ja besser werden.
Könnt Ihr mir vielleicht einen Schubs geben, damit ich in die richtige Richtung weiter machen kann?
Danke und Gruß
Malte