ValueError: invalid literal for int() with base 10: ' ': Was mache Ich Falsch?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Finn2431
User
Beiträge: 2
Registriert: Samstag 3. Februar 2024, 14:24

Hallo,
Ich möchte mir als Übung meiner Python-kenntnisse Das Bekannte Spiel "Zahlen-Raten" in tkinter programmieren, stoße aber immer wieder auf den folgenden fehler:

Code: Alles auswählen

 ValueError: invalid literal for int() with base 10: ' ' 
Was Mache ich Falsch? Hier der Ganze Code:

Code: Alles auswählen

from tkinter import *
import random
n = random.randint(1,10)
nstring = str(n)
window = Tk()
window.title("Zahlen Raten")
label1 = Label(window, text="Ich habe mir eine zahl zwischen 1-10 gedacht. Rate sie!")
label1.pack()
input_field = Entry(window)
input_field.pack()
label2 = Label(window, text="")
label2.pack
c = input_field.get()
cint = int(c)
while True:
	if cint == n:
		del label2
		del label4
		del label5
		label3 = Label(window, text="Exakt! Es war die " + nstring)
		label3.pack
		break
       
	if cint < n:
		del label2
		del label3
		del label5
		label4 = Label(window, text="Größer!")
		label4.pack
	if cint > n:
		del label2
		del label3
		del label4
		label5 = Label(window, text="Kleiner!")
		label5.pack

Bitte schreibt mir nix über die Variablennamen, Die Syntax oder sonst etwas was nicht umbedingt wichtig ist, damit das Programm Funktioniert

LG Finn
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Finn2431 hat geschrieben: Samstag 3. Februar 2024, 14:30

Code: Alles auswählen

 ValueError: invalid literal for int() with base 10: ' ' 
Ein Leerzeichen ist halt keine Zahl. Wenn eine solche Eingabe vorliegt, solltest du eine entsprechende Fehlermeldung in deiner Oberfläche anzeigen lassen.

Und mich wundert auch, dass da kein Mainloop gestartet wird. Zusätzlich fehlen bei einigen Methoden die Klammern, damit sie überhaupt aufgerufen werden.

``del`` benutzt man so gut wie nie in Python. Schon gar nicht mit Namen, die zu dem Zeitpunkt noch gar nicht existieren.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zeig' doch mal den realen Code. Der gezeigt hat diverse NameErrror. Plus die Punkt, die snafu schon erwähnt hat.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Finn2431: Und dann wären da noch die Namen, die sind wichtig um Programme zu schreiben die funktionieren, denn man schreibt nicht nur, man liest öfter. Beim Fehlersuchen beispielsweise und wenn man den Code dann mal mit einer Frage anderen Leuten zeigt, müssen die das auch lesen und verstehen können. Gute Namen machen das einfach(er). Schlechte Namen führen zu mehr Fehlern.

Für GUI-Programme muss man die Grundlagen inklusive objektorientierter Programmierung (OOP) drauf haben, denn das braucht man für jedes nicht-triviale GUI-Programm. Der gezeigte Code verwendet noch nicht einmal Funktionen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

*-Importe benutzt man nicht, weil damit verschleiert wird, woher welcher Name stammt.
Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Variablennamen nummeriert man nicht durch, sondern gibt ihnen sprechende Namen.
Zum Zeitpunkt, an dem Du input_field.get() aufrufst, hatte der Nutzer noch gar keine Gelegenheit, etwas einzugeben. GUIs arbeiten Ereignisorientiert und nicht Linear.
Weder löscht man in Python Variablen per del nocht löscht man Labels in GUIs. In Deinem Fall würde man einfach den Inhalt des Labels ändern. pack sollte man im Übrigen auch aufrufen.
Wenn man Eingaben umwandelt, muß man auf entsprechende Exceptions reagieren.
Du hast gar keinen Knopf, den man drücken könnte, wenn man seine Zahl eingegeben hat. Wie soll das Programm dann auf eine Eingabe reagieren können?
Eine GUI braucht immer einen Aufruf von mainloop, damit die GUI arbeiten kann.

Code: Alles auswählen

import random
import tkinter as tk
from functools import partial

def guess(input_field, info_label, number):
    try:
        value = int(input_field.get())
    except ValueError:
        info_label['text'] = 'Bitte eine Zahl eingeben.'
    else:
        if number == value:
            info_label['text'] = f"Exakt! Es war die {number}"
        elif number > value:
            info_label['text'] = 'Größer.'
        else:
            info_label['text'] = 'Kleiner.'


def main():
    number = random.randint(1,10)
    window = tk.Tk()
    window.title("Zahlen Raten")
    tk.Label(window,
        text="Ich habe mir eine Zahl zwischen 1-10 gedacht. Rate Sie!"
    ).pack()
    input_field = tk.Entry(window)
    input_field.pack()
    info_label = tk.Label(window, text="")
    info_label.pack()
    tk.Button(text="Raten",command=partial(guess, input_field, info_label, number)).pack()
    window.mainloop()

if __name__ == "__main__":
    main()
Finn2431
User
Beiträge: 2
Registriert: Samstag 3. Februar 2024, 14:24

Erstmal danke für die vielen Antworten. @Sirius3: Der Code den du mir geschickt hast funktioniert zwar, aber ich verstehe ihn nicht. Könntest du ihn mir vielleicht erklären?
PS: Ich bin noch eher ein Neuling in der GUI-Programmierung und auch in der regulären Python-Entwickelung noch nicht so gut.
LG Finn
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Was konkret verstehst Du nicht?
Antworten