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