Checkbox state in Liste speichern

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Hart mit Bart
User
Beiträge: 25
Registriert: Dienstag 30. Oktober 2018, 12:05

Hallöchen,

ich komme gerade nicht weiter und habe vom Rumsuchen auf Google schon eckige Augen. Vielleicht kann mir jemand einen Schubs in die richtige Richtung geben? Ich erwarte keinen fertigen Code. Ein paar Stichpunkte, wonach ich suchen sollte, würden mir schon reichen. Den Rest knobel ich dann selbst aus oder würde dann nochmal hier aufschlagen.

Betriebssystem: Windows 10
Python Version: 3.7
wxPython Version: 4.1.0
Editor: PyCharm Community 2020

Und hier das Problem:

Ich habe 2 Checkboxen ...

Code: Alles auswählen

	self.checkbox_1 = wx.CheckBox(self.notebook_1_pane_2, wx.ID_ANY, "Distanz")
        self.checkbox_2 = wx.CheckBox(self.notebook_1_pane_2, wx.ID_ANY, "Zeit")
... und eine Liste:

Code: Alles auswählen

	my_list = [[1, "Distanz", True], [2, "Zeit", True]]
Der boolsche Wert in der Liste ist der State der jeweiligen Checkbox.

Wenn eine Checkbox geklickt wird, soll der neue State in der Liste geändert werden. Mit ...

Code: Alles auswählen

	def onChecked(self, e):
        	cb = e.GetEventObject()
        	print(cb.GetLabel())
... komme ich schonmal an den entsprechenden Wert der Sublist. Und an der Stelle steige ich gerade mental aus. Ich bin sicher, dass das eigentlich ein sehr eimpler Vorgang ist, der vermutlich mit einem Ein- oder Zweizeiler erledigt ist. Basiswissen quasi.

Wie gesagt: ein Stichpunt, der mich in die richtige Richtung schickt, wäre nett.

Liebe Grüße

Edit: Müsste ich vllt die gesamte Liste in einer Schleife durchlaufen, die nach z.B. "Distanz" sucht und dann quasi den Wert im entsprechenden index+1 ändert?
Hart mit Bart
User
Beiträge: 25
Registriert: Dienstag 30. Oktober 2018, 12:05

Ich glaube, dass ich der Sache auf der Spur bin.

Mit ...

Code: Alles auswählen

for sublist in data_list:
  if cb.GetLabel() in sublist:
    index_sublist = sublist
    data_list[index_sublist[2]] = cb.GetValue()
    break
... bekomme ich den richtigen Index in der Liste und kann den Wert an der richtigen Stelle ändern. Nehme ich an. Allerdings schmeißt mir ...

Code: Alles auswählen

for sublist in data_list:
    if sublist[2] == True:
        print(sublist[0], sublist[1]])
... eine Fehlermeldung aus:
TypeError: 'bool' object is not subscriptable
Ich möchte eventuell alle Datensätze, deren korrespondierende Checkboxen gecheckt sind, auf dem Bildschirm ausgeben.

Edit: Hm, nein. index_sublist ist immer 1. *grübel*
Hart mit Bart
User
Beiträge: 25
Registriert: Dienstag 30. Oktober 2018, 12:05

Okay, ich habe es herausgefunden.

Code: Alles auswählen

for sublist in data_list:
  if cb.GetLabel() in sublist:
    sub_index = data_list.index(sublist)
    data_list[sub_index][2] = cb.GetValue()
    break
Für das Beispiel "Zeit" bekäme ich den sub_index 1.

Code: Alles auswählen

for sublist in data_list:
    if sublist[2] == True:
        print(sublist[0], sublist[1])
So bekomme ich tatsächlich die gewünschte Ausgabe.

Jetzt wäre Python nicht Python, wenn es nicht eine Drölfzillion Möglichkeiten gibt, Dinge kürzer und eleganter auszudrücken. Aber das ist gerade jenseits dessen, was ich mir spontan selbst erarbeiten kann.

Irgendwie war mein Thread jetzt auch einigermaßen sinnbefreit. Aber vielleicht hilft er irgendwann einem armen Tropf weiter.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Aus den kurzen Abschnitten kann man nicht viel ablesen. Mir soviel: die Variablennamen sind schlecht. Benutze keine Abkürzungen und keine nichtssagenden Präfixe wie my oder list. Einen Index in der Liste zu speichern ist unnötig, da jeder Eintrag schon eine feste Position hat. Warum speicherst Du überhaupt den Wahrheitswert in einer Liste? Wenn du ihn brauchst kannst du doch auch die Checkboxen abfragen.
Hart mit Bart
User
Beiträge: 25
Registriert: Dienstag 30. Oktober 2018, 12:05

Ich verstehe, ja. Die GUI und mein Programm sind gerade noch in 2 getrennten Dateien, die ich im Moment zusammenführe.

Mein Programm liest mit BeautifulSoup Daten von einem Link aus, den man einem Eingabefeld übergibt. Das sind ca. 55 (meine ich) Datensätze, die immer gleich aufgebaut sind: Name, Wert, Einheit. Die Datensätze sind wiederum 8 Kategorien oder Überschriften zugehörig. Im Programm soll man nun über die Checkboxen auswählen, welche dieser Datensätze angezeigt werden sollen. Standardmäßig werden alle Datensätze angezeigt. Diese werden dann in einem Textfeld angezeigt. Per Button kann man diese dann in das Clipboard kopieren und - forumsgerecht formatiert - irgendwo einfügen können. Letzteres geschieht dann klassisch per STRG-V.

Danke für den Hinweis. An den Variablennamen muss ich in der Tat arbeiten. Ich programmiere noch immer mehr für mich als unter dem Vorsatz, dass auch andere das lesen und verstehen können. Wobei ich selbst wohl auch irgendwann mental aussteige, wenn das Projekt größer wird und ich nicht mehr täglich mit der Nase im Quellcode stecke.
Außerdem muss ich mir angewöhnen, meine Codeabschnitte zu kommentieren. Ich befürchte, dass mir diese Nachlässigkeit sonst irgendwann auf die Füße fallen wird.

Wenn ich eine erste halbwegs lauffähige Version habe, die ich vorzeigbar finde, ohne vor Scham im Boden versinken zu müssen, zeige ich den kompletten Code her. Gerade läuft es aber gut.
Antworten