``conn.pgcursor`` sieht auch verdächtig komisch aus. Was ist denn `conn` hier und wie kommt da `pgcursor` drauf? Datenbankcursor haben in aller Regel eine kurze Lebensdauer, so dass man die nicht wirklich sinnvoll an die Verbindung heften kann. Und falls die Verbindung hier aus einem Fremdmodul kommt, pappt man da nicht einfach selber irgendwelche Attribute dran.
Das ``roa[1],`` ist ein Tupel mit einem Element. Ich denke Du willst da als `command` eher kein Tupel übergeben, denn Tupel sind nicht aufrufbar, machen als `command` also gar keinen Sinn.
Der Code sollte also eher so aussehen (ungetestet, mit `closing()` aus dem `contextlib`-Modul):
Code: Alles auswählen
...
with closing(connection.cursor()) as cursor:
cursor.execute(
"SELECT name, lower(command) FROM links WHERE rechte <= 1"
)
menu_rows = cursor.fetchall()
for item_name, command_name in menu_rows:
menubar.add_command(
label=item_name, command=NAME_TO_COMMAND[command_name]
)
Da ist dann auch nicht das unsägliche `roa` sondern gleich sinnvolle Namen für die beiden Elemente.
Problem ist hier noch, dass die Funktion wahrscheinlich noch irgendwelche Argumente brauchen wird, denn wenn da am Ende `cleaning` aufgerufen wird, dann muss da ja irgendwie `textfeld` hin übergeben werden, wie Sirius3 angemerkt hat.
Und das geht bei GUI-Programmen über objektorientierte Programmierung (OOP). Da kommt man nicht wirklich drum herum wenn man eine nicht total triviale GUI programmiert.