@Andrey35: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Auch Inhaltlich sind viele nicht gut. Wenn man keinen Einzelwert hat, sondern eine Sequenz, dann sollte man das am Namen ablesen können. `Spaltenanzahl` wäre *eine* Spaltenanzahl. Das scheint aber eine Liste oder ähnliches zu sein.
`check_bearbeiten` ist ein komischer Name für einen Index. Das klingt auch sehr nach einer Tätigkeit, also als wenn das eine Funktion oder Methode und kein eher passiver Wert ist.
Eigentlich willst Du dauch gar keinen Index sondern über Elemente von `Spaltennamen` iterieren. Was da komisch aussieht, ist das da anscheinend auch wieder Sequenzen drin sind, von denen Du immer das erste Element (Index 0) verwendest. Was ist denn da noch drin? Oder ist das ein Ergebnis einer Datenbankabfrage und Du hast die einelementigen einfach nur nicht ”ausgepackt”? Falls das der Fall ist, ist das bei `Spaltenanzahl` auch so? Das wäre echt furchtbar verwirrend wenn Du da überall einelementige Tupel weiterverwendest und deswegen dauernd ``[0]`` überall dranstehen muss. Das löst man *einmal* und nicht jedes mal wenn man auf so einen Wert zugreifen will.
Der Ausdruck ``Spaltennamen[check_bearbeiten][0]`` steht drei mal in dem Quelltextabschnitt, statt das das *einmal* an einen Namen gebunden wird.
`Matrikelnummer_zum_Bearbeiten`? Gibt es noch andere in diesem Kontext/Namensraum? Kann das nicht einfach `makrikelnummer` heissen?
Man kann den Abgefragten Wert direkt als Wahrheitswert verwenden falls da kein NULL in den Spalten stehen kann (und es nicht okay ist den als `False` zu interpretieren).
`ListeCheckbox_Bearbeiten` klingt wieder nach eine Tätigkeit, nicht nach passiven Werten. Grunddatentypen haben in Namen nichts verloren.
Die beiden Zweige von dem ``if``/``else`` enthalten den gleichen Code, das gehört da also nicht zweimal hin. Ich nehme an in der Leerzeile im ``else`` wolltest Du ein `select()` unterbringen. Das wäre dann aber das einzige was diese beiden Zweige unterscheidet und auch das einzige was da drin stehen müsste. Womit ein ``if`` ausgereicht hätte. Da man `tkinter.Variable`-Objekten auch gleich beim Erstellen einen Wert mitgeben kann, braucht man aber überhaupt keine Fallunterscheidung sondern setzt einfach den abfragten Wert ein. Und vielleicht auch in ein `tkinter.BooleanVar`.
`mb`? Abkürzungen sind doof. Namen sollen dem Leser die Bedeutung von den Werten dahinter vermitteln, nicht zum Rätselraten zwingen.
Zeichenketten und Werte mit `str()` und ``+`` zusammenstückeln ist eher BASIC denn Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode und f-Zeichenkettenliterale.
Die magische 7 und `Spaltenanzahl` und warum diese `range()` Sinn macht, sollte dringend erklärt werden. Das sieht sehr komisch aus.
Zwischenstand:
Code: Alles auswählen
spalten_check_variables = []
#
# TODO Magische 7 und den Endwert erklären warum/welchen Sinn das macht,
# und warum das immer korrekt ist. Für die 7, falls das nicht besser
# lösbar ist, eine sinnvoll benannte Konstante definieren.
#
for was_auch_immer_das_hier_ist in spaltennamen[
7 : spaltenanzahlen[0]
]:
spaltenname = was_auch_immer_das_hier_ist[0]
cursor.execute(
f"SELECT {spaltenname} FROM benutzer WHERE matrikelnummer=%s",
[matrikelnummer],
)
variable = tk.BooleanVar(value=cursor.fetchone()[0])
mb.menu.add_checkbutton(label=spaltenname, variable=variable)
spalten_check_variables.append(variable)
Für jeden Wert eine neue Abfrage zu starten, wo die doch alle zusammen in einem Datensatz stehen, ist komisch. Da würde man eher alle auf einmal abfragen:
Code: Alles auswählen
#
# TODO Magische 7 und den Endwert erklären warum/welchen Sinn das macht,
# und warum das immer korrekt ist. Für die 7, falls das nicht besser
# lösbar ist, eine sinnvoll benannte Konstante definieren.
#
ausgewaehlte_spaltennamen = [
spaltenname[0]
for spaltenname in spaltennamen[7 : spaltenanzahlen[0]]
]
cursor.execute(
"SELECT {} FROM benutzer WHERE matrikelnummer=%s".format(
",".join(ausgewaehlte_spaltennamen)
),
[matrikelnummer],
)
spalten_check_variables = []
for spaltenname, wert in zip(
ausgewaehlte_spaltennamen, cursor.fetchone()
):
variable = tk.BooleanVar(value=wert)
mb.menu.add_checkbutton(label=spaltenname, variable=variable)
spalten_check_variables.append(variable)