Python 3.X. Frage

Ich sitze momentan echt auf dem Schlauch.
Ich hatte letztens mich mal wieder mit Python auseinander gesetzt und ein wirklich extrem simples Programm mit kleiner GUI usw. geschrieben.

Als dann alles lief, auch so wie ich es mir vorgestellt habe, wollte ich Fehlern vorbeugen.
Ich erläutere kurz und ist dann der Codeabschnitt:

In ein Eingabefeld sollen nur natürliche Zahlen eingeben werden (Integer). In einer Funktion wird dann die Eingabe abgerufen werden und es soll festgestellt werden ob die Eingabe korrekt ist, dass bedeutet, keine Strings, keine Floats oder eine leere Eingabe.

Code:
Code:
def test():
    t = int(eingabe.get())

    if t > 0:
        te=t*60
        tkinter.messagebox.showinfo("Info", "Irgend eine Text.")
        print (te)
        
    else:
        tkinter.messagebox.showwarning("Warnung", "Ihre Eingabe war nicht korrekt. \nVersuchen Sie es erneut.")
Wie kann ich jetzt in die Funktion die Abfrage, nach korrekter Eingabe, reinbringen? Ein Punkt das t > 0 sein soll, ist ja schon implementiert, aber beim rest.... keinen Plan XD, da es mit if not auch nicht funktioniert.


Danke für eure Hilfe

/edit:
Sry das der Code nicht vernünftig aussieht, aber es ist alles so eingerückt, wie es muss
 
Zuletzt bearbeitet von einem Moderator:

f4kir

New member
Hi

Deine Variable "eingabe" scheint ein String Objekt zu sein. Ein Vorschlag: du könntest einfach testen, ob es den entsprechenden Regex Ausdruck erfüllt: ^[0-9]+$, wenn ich dich richtig verstanden habe. Das wäre dann für nat. Zahlen.
...nur natürliche Zahlen eingeben werden (Integer).
Integer = ganze Zahl != natürliche Zahl (i.A.)

Grüsse
 

CDW

Moderator
Mitarbeiter
Wie kann ich jetzt in die Funktion die Abfrage, nach korrekter Eingabe, reinbringen?
Ist doch schon zum Teil ;)
Interaktive Pythonkonsole:
Code:
>>> int("1")
1
>>> int("1.0")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1.0'
>>> int("foo")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'foo'
Falls also "etwas nicht stimmt" wird bei Dir eine Exception geworfen.

Siehe auch die Dokumentation:
https://docs.python.org/3/library/functions.html#int
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in radix base
und der Verweis auf https://docs.python.org/3/reference/lexical_analysis.html#integers
Vereinfacht gesagt:
Falls der Input von int( ) als String vorliegt (also Dein Fall ;) ), muss die ganze Zahl darin in gleicher Form vorliegen, wie in Pythoncode selbst.
Was die Anforderungen "kein Float, kein String als Eingabe" erfüllt.
Und den Rest erledigt man einfach mit "try and error-handling" ;)

Code:
try:
   t = int(eingabe.get())
   if t < 0:
       raise ValueError("nat. numbers only!")
except ValueError, ex:
   print("Ihre Eingabe war nicht korrekt, weil: {reason}".format(reason=ex))
Ist zwar Python2, sollte sich aber leicht umscheiben lassen ;)
 
Okay danke. Auf die Doku hätte ich auch selber kommen können :D und auch danke für dein Beispiel als Code.
Ich versuche morgen mal mein Glück und werde es abändern, ist ja eh nur was zum Zeitvertreib.
Ach und f4kir:
Wenn du es so siehst mit den natürlichen Zahlen gebe ich dir Recht, aber was ist wenn es umgedreht wird?

natürliche Zahl = ganze Zahl = Integer :p ;)
 
So hat funktioniert ;)

Danke nochmal für die Hilfe.

Code:
try: 
       t = int(eingabe.get())
       if t < 0:
           raise ValueError()
       else:
           Berechnung mit t
           tkinter.messagebox.showinfo("Info", "Text.")
           auszuführender Befehl
           
except ValueError: 
       tkinter.messagebox.showwarning("Warnung", "Ihre Eingabe war nicht korrekt. \nVersuchen Sie es erneut.")
 
Oben