Frage zu Customtkinter

Fragen zu Tkinter.
Antworten
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Hallo ,

ich habe mal eine bitte , vielleicht werden hier einige daraus schlau.
Ich habe mir ein kleines Programm gebaut wo nur 2 Entry Felder sind , die dann ebend die Werte zu einer Function schicken und das abarbeiten . Also nix besonderes .

Meine Frage ist sobald ich ins Textfeld klickeund Schreiben will kommt sofort dieser fehler.

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.12/tkinter/__init__.py", line 592, in get
    return self._tk.getint(value)
           ^^^^^^^^^^^^^^^^^^^^^^
_tkinter.TclError: expected integer but got "0k"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.12/tkinter/__init__.py", line 1967, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "/home/torsten/PycharmProjects/Terminal App/.venv/lib/python3.12/site-packages/customtkinter/windows/widgets/ctk_entry.py", line 120, in _textvariable_callback
    if self._textvariable.get() == "":
       ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/tkinter/__init__.py", line 594, in get
    return int(self._tk.getdouble(value))
               ^^^^^^^^^^^^^^^^^^^^^^^^^
_tkinter.TclError: expected floating-point number but got "0k"


Aber das Programm läuft und funktioniert aber komischer weise.


Weiß einer was das ist ?
Er sagt was von Gleitkomma Zahlen erwartet ....

Da ich in der Datenbank 2 Felder habe die nur Zahlen erwarten also Integer , habe ich auch die Variablen in der IntVar gesetzt .
Sirius3
User
Beiträge: 18215
Registriert: Sonntag 21. Oktober 2012, 17:20

Und du hast "ok" eingegeben. Das ist keine Zahl.
Bitte den Code zum Fehler posten.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Bin grade auf dem Weg zur Nachtschicht.
Werde den Morgen dann mal reinsetzen.

Sorry mein Fehler .

Nein habe nur Zahlen eingegeben .
Das ist ja das kuriose.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Code: Alles auswählen


#Test 
def finanz(kto,pincode):
    connect = conn()
    cursor = connect.cursor()
    cursor.execute("SELECT username,konto,kontostand,datum,time,von,summe,verwendung,pin FROM bank WHERE konto = %s",[kto])
    username,konto,kontostand,datum,time,von,summe,verwendung,pin = cursor.fetchone()
    connect.close()

    if pincode != pin:

       


        raise EXCEPTION(messagebox.showerror("Information","Die Pin eingabe ist leider Falsch"))

    else:
        


       print("Alles Ok")






app = ck.CTk()
app.title(" Terminal Center")
app.geometry("800x700")

tabcontrol = ttk.Notebook(app)
tabcontrol.pack(expand=1,fill="both")
link1 = ttk.Frame(tabcontrol)
link2 = ttk.Frame(tabcontrol)
link3 = ttk.Frame(tabcontrol)
link4 = ttk.Frame(tabcontrol)


tabcontrol.add(link1, text="Startseite")

tabcontrol.add(link2, text="Finanzübersicht")
tabcontrol.add(link3, text="Einzahlung")
tabcontrol.add(link4,text="Überweisungen")








my_image = ck.CTkImage(light_image=Image.open('logospk.png'),
size=(350,60)) # WidthxHeight

my_label = ck.CTkLabel(app, text="", image=my_image)
my_label.place(y=50,x=210)


label_info = ck.CTkLabel(app,text="",font=(arial(),font_14()))
label_info.place(y=580,x=350)


oben = ck.CTkLabel(app,text="Deine Kontonummer",font=(arial(),font_14())).place(y=650,x=10)
oben2 = ck.CTkLabel(app,text="Dein Pin",font=(arial(),font_14())).place(y=650,x=385)
kto = IntVar(app)
pincode = IntVar(app)
ck.CTkEntry(app,width=200,corner_radius=10,textvariable=kto).place(y=650,x=150)

ck.CTkEntry(app,width=200,textvariable=pincode).place(y=650,x=450)

btn = ck.CTkButton(app,text="Login",command=lambda : finanz(kto.get(),pincode.get()))
btn.place(y=650,x=650)





app.mainloop()

Mein Fahrer kommt 5 Min Später , so habe ich ebend Zeit das noch reinzusetzen.

Schönen Abend ... !
Sirius3
User
Beiträge: 18215
Registriert: Sonntag 21. Oktober 2012, 17:20

Leerzeilen sollen die Lesbarkeit erhöhen. Deine zufällig verteilten Leerzeilen tun das Gegenteil. Wenn Du hier also Hilfe willst, solltest Du es den Helfewilligen nicht unnötig schwer machen.
Das betrifft auch die kryptischen Variablennamen. Was ist ein kto?
Ebenso fehlen wichtige Teile des Programms (z.b. die Importe). So muß man raten, was Du wirklich machst.
Bei Deiner SQL-Tabelle gibt es datum und time? Entweder sollte das ein Feld vom Typ TIMESTAMP sein, oder es sollte klar werden, wofür datum und wofür time steht.
Die Tabelle scheint auch weit von irgendeiner Normalform entfernt zu sein, ich würde dringend empfehlen, ein Tutorial zum Tabellendesign durchzuarbeiten.
`EXCEPTION` ist wie eine Konstante geschrieben, Konstanten sind aber selten Klassen. Wenn die Funktion `finanz` (Funktionen sollten übrigens nach Tätigkeiten benannt sein) eine Callback-Funktion ist, dann gibt es keine Stelle, die etwas sinnvolles mit der Exception anfangen würde, diese mußt Du also selbst abfangen und in eine für die GUI sichtbare Fehlermeldung umwandeln. Der Rückgabewert von messagebox.showerror ist kein sinnvoller Wert für eine Exception.
Ebenso ist ein `print` in einer GUI nicht sinnvoll.
Alles ab Zeile 28 sollte auch in einer Funktion stehen. Ein ordentliches Programm benutzt keine globalen Variablen.
`place` benutzt man nicht, weil es zu nicht portablen GUI-Programmen führt.

Der Fehler ist immer noch, dass Du irgendwo etwas anderes als eine Zahl eingegeben hast. Von alleine kommt der Fehler nicht.
Aber um solche Fehler besser behandeln zu können, sollte man für Textfelder eh immer StringVar benutzen, und erst bei der Weiterverarbeitung prüfen, ob die Eingabe eine Zahl ist.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Will mich zu meinen Script jetzt nicht dazu äußern , da ich schon viele Script gesehen habe die auch so in der Art ihre Script aufbauen .

Aber zu meinen Problem , der Fehler kommt ja sobald ich schon die erste Zahl nur eintippe ohne das ich was absende und nein, ich habe kein Wort eingegeben nur zahlen .

Muss ansonsten morgen mal wenn ich daheim bin mich bei Google schlau machen .
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

@TorstenVoelker: Das Problem hatte ich in dem anderen Thread ja schon benannt: Du köchelst in deiner eigenen Suppen. So kann in meinen Augen kein Fortschritt stattfinden. Die Hinweise zu deinem Code solltest du nicht einmal mehr ignorieren sondern das als Möglichkeit wahrnehmen, dich zu verbessern. Und ich hatte auch geschrieben, dass du mit den Basics anfangen solltest. Das zeigt der Quellcode mMn sehr deutlich. Und ich befürchte, die fehlenden Grundlagen führen auch dazu, dass du Sirius3s Beitrag nicht verstehst.

Und das sorgt auch dafür, dass du hier Informationen dropst und dann hoffst, dass zufällig jemand daraus den Fehler erkennen kann.

Bitte zeig immer den _kompletten_ Quellcode.
Erklär, was du erwartest und was stattdessen passiert.
Zeige die komplette Fehlermeldung, falls eine Auftritt.

Ich denke, es sollte sich von selbst verstehen, dass man es den Helfenden möglichst einfach macht. Und dazu gehört mindestens das.
Und natürlich auch, Hinweise zum Quellcode umzusetzen. In der Regel werden die ja nicht ohne Grund benannt und basieren auf entsprechender Erfahrung. Und "ich habe das schon anders im Internet gesehen" ist ein schlechtes Argument, wenn ich mir das Internet so anschaue.
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

@sparrow werde mir dieses für‘s nächste mal hinter die Ohren schreiben .


Thema Fehler der ist behoben .
Habe bei YouTube die Lösung gefunden .
Es lag an das Ctk selbst .
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

@TorstenVoelker: Wie wäre es, wenn du die Lösung teilst? Dann würden Menschen mit dem selben Problem die Lösung hier finden.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Steht das `k` in `ck` für `tkinter`?

Es macht keinen Sinn von einer Datenbanktabelle acht Werte abzufragen und dann nur einen einzigen davon zu verwenden. Das wäre also eigentlich nur:

Code: Alles auswählen

    with closing(connect()) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute(
                "SELECT pin FROM konto WHERE nummer=%s", [account_number]
            )
            expected_pin = cursor.fetchone()[0]
Oder man lässt die Überprüfung der Pin gleich die Datenbank machen:

Code: Alles auswählen

            cursor.execute(
                "SELECT 1 FROM konto WHERE nummer=%s AND pin=%s",
                [account_number, pin_code],
            )
            is_pin_correct = cursor.fetchone() is not None
Wobei man in echtem Code natürlich keine PINs, also letztlich Passwörter, im Klartext in der Datenbank speichern würde. Aber da sind wir wieder bei dem Thema dass das hier alles schon viel zu weit von den Grundlagen entfernt ist, die erst einmal beherrscht werden wollen.

Was machen denn die Funktionen `arial()` und `font_14()`? Der Verdacht liegt nahe das die einfach jeweils eine konstante Zeichenkette bzw. Zahl liefern — das sind dann also keine Funktionen, sondern Konstanten.

`oben` und `oben2` werden an den Rückgabewert von einem `place()`-Aufruf gebunden, was keinen Sinn macht.

Man nummeriert auch keine Namen. Entweder will man sich dann bessere Namen überlegen, oder gar keine Einzelnamen und -werte, sondern eine Datenstruktur. Oft eine Liste.

`my` macht als Namenszusatz gar keinen Sinn wenn es nicht auch ein `our` oder `their` oder etwas gibt was sich von dem `my` absetzt.

Was an dem von Sirius3 schon angesprochenen `place()` unsinnig ist, ist das das Notebook mit `pack()` angeordnet wird, dann aber die anderen Widgets mit `place()` auf das Fenster gekleistert werden, also über jede der vier Notebook-Seiten gemalt werden, und damit auch über deren späteren Inhalt.

Die Programmlogik ist nicht von der Benutzerinteraktion getrennt. Sollte sie aber, damit man sie leicht testen kann, Fehlersuche in der Programmlogik ohne zusätzlichen GUI-Code passieren kann, und die Programmlogik auch ohne GUI wiederverwendet werden kann statt dass man Code der das gleiche tut mehrfach schreiben muss.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Antworten