Tkinter variable in anderes Modul übergeben

Fragen zu Tkinter.
Antworten
Benutzeravatar
Sokrates19
User
Beiträge: 7
Registriert: Mittwoch 13. Januar 2021, 19:27

Hallo alle zusammen,
ich wage mich das erste mal an das Programmieren eines GUI mit tkinter, also nehmt mir bitte das ein oder andere fragwürdige im code nicht übel. Das Problem welches ich habe ist das ich eine Variable durch einen Knopfdruck auf einen bestimmten wert setzen möchte( Funktion A). Das Problem welches ich nun habe ist das die Variable x, für die Spätere Funktion Rechen gebraucht wird um zu gucken was addiert wird, nachdem ich auf den Tkinter Knopf von der Funktion A(1Euro) gedrückt habe ,somit x definiert habe oder?, drücke ich auf den Knopf für Rechen(test) um meine sql Datenbank zu updaten, jedoch kommt dann folgende Fehlermeldung: NameError: name 'x' is not defined. Kann mir bitte jemand weiterhelfen?

Code: Alles auswählen

import tkinter
import sqlite3
#Funktion zum Anzeugen des betrages
def Befehl():
    l = str(e.get())
    sql = "SELECT * FROM personen WHERE kartennummer =?"
    cursor.execute(sql, (l,))
    for dsatz in cursor:
        n = str(dsatz[0])
        g = str(dsatz[1])
        a = str(dsatz[3])
        lb["text"] = "Daten:" + str(n) + str(g) + str(a)
    
def A():
    x = int(1)
    return(x)

def Zwei():
    x = int(2)
    return(x)

def Drei():
    x = int(3)
    return(x)

#def Vier():
    #kommt noch
    #p.get()
    
def Rechnen():
    l = str(e.get())
    sql= "SELECT * FROM personen WHERE kartennummer =?"
    cursor.execute(sql, (l,))
    if x == 1:
        for dsatz in cursor:
            f=float(dsatz[3])
            y=float(f+1)
        
    if x == 2:
        for dsatz in cursor:
            f=float(dsatz[3])
            y=float(f+2)
        
    if x == 3:
        for dsatz in cursor:
            f=float(dsatz[3])
            y=float(f+0.5)
        
    #if x==4:
    #kommt noch

    sql= "UPDATE personen SET betrag = ?" \
         "WHERE kartennummer = " +str(l)
    cursor.execute(sql, (y,))
    connection.commit()


def ende(): 
    main.destroy()

main = tkinter.Tk()

connection = sqlite3.connect("Betrag.db")
cursor = connection.cursor()

Eins = tkinter.Button(main, text = "1 Euro",
                      command = A())
Eins.pack()

# einzeiliges Eingabefeld
e = tkinter.Entry(main)
e.pack()

#Schaltfläche zur Verarbeitung und Ausgabe
test = tkinter.Button(main, text = "Test",
                      command = Rechnen)
test.pack()

bquad = tkinter.Button(main, text = "Suche",
                       command = Befehl)
bquad.pack()

lb = tkinter.Label(main, text = "Ergebnis")
lb.pack()

bende = tkinter.Button(main, text = "Ende",
                       command = ende)
bende.pack()

main.mainloop()
connection.close()
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktionen werden wie Variablennamen komplett klein geschrieben. Funktionen werden nach Tätigkeiten benannt.
Einbuchstabige Namen sind schlecht, weil sie nichtssagend sind. Auch Abkürzungen sind schlecht, dsatz?
Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Bei `Befehl` fehlen e, cursor und lb. cursor sind eigentlich etwas kurzlebiges und sollten pro Transaktion erzeugt werden.
Wenn man exakt einen Datensatz erwartet, benutzt man fetchone, statt einer for-Schleife, denn die ist sehr verwirrend, weil man sich fragt, warum alles bis auf den letzten Durchlauf überschrieben wird.
Man benutzt keine *-SELECT, sondern gibt die Felder, die gebraucht werden explizit an, die die man nicht braucht gar nicht.
A scheint ein Callback für eine Funktion sein, dort sind Rückgabewerte sinnlos. Zwei, Drei und Vier werden nirgends benutzt. `return` ist keine Funktion, die Klammern also verwirrend. 1, 2 oder 3 sind schon vom Typ int, der int-Aufruf also unsinnig.
Beim Eins-Button bindest Du auch den Rückgabewert von A an command, statt die Funktion A selbst.
In `Rechnen` stückelst Du in eine SQL-Statement Parameter per String+, das darf man niemals machen, dafür gibt es Platzhalter, die Du ja sonst überall auch benutzt.
Alles ab Zeile 61 gehört auch in eine Funktion, damit man gar nicht erst in Versuchung gerät, globale Variablen zu benutzten.
Für jedes nicht-triviale GUI-Programm sind Klassendefinitionen nötig.
Benutzeravatar
Sokrates19
User
Beiträge: 7
Registriert: Mittwoch 13. Januar 2021, 19:27

Super, danke für die Antwort, und nicht wundern 2 drei und 4 hat noch ne Funktion
Grüße Sokrates
Antworten