Zwischen einer Zahl und einem String unterscheiden

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
3D_Schorsch
User
Beiträge: 4
Registriert: Montag 6. April 2020, 13:19

Hallo,

Ich habe eine Funktion, mit einer if-abfrage, in der ich zwischen einer Zahl (1,2, 3, usw. ) und einem String (Text) unterscheiden will.
(Arbeite mit tkinter)
Das Problem, es kommt eine Fehlernachricht.

Es wäre toll wenn jemand den Fehler findet oder eine andere Lösung hat.

MG
3D_Schorsch

Der Code

Code: Alles auswählen

def buttonokClick():
    if float:
        #Uebernahme der Daten
        #ege = eingabe und durch = durchgaenge
        egedurch = float(entrydurch.get())
        print ("ok")
        entrydurch.delete(0, "end")
        entrydurch.insert(0, "")
        print (egedurch)
        print ("ok ende")
    if str:
        print ("Das ist ein Text ")
    else:
        print ("Fehler")
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Möchtest du zwischen Integer und String unterscheiden oder möchtest du schauen ob der String ein Integer enthält?

"9" ist ja eine Zahl, aber auch ein String, aber kein Integer.

#edit:
Schau dir mal das an:

Code: Alles auswählen

var = 5
print(isinstance(var, int))
Soweit ich glaube zu wissen ist der Rückgabetyp eines entry.get() aber immer ein String.
3D_Schorsch
User
Beiträge: 4
Registriert: Montag 6. April 2020, 13:19

Ich möchte unterscheiden, ob es eine Zahl oder ein Text ist

Danke für die schnelle Antwort
Zuletzt geändert von 3D_Schorsch am Montag 6. April 2020, 14:18, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@3D_Schorsch: Wie Jankie schon sagte liefern ein `Entry.get()` immer eine Zeichenkette.

Verwendet keine kryptischen Abkürzungen bei Namen. Wenn man bei `egedurch` in einem Kommentar erklären muss, dass man dieses ”Wort” in `ege` und `durch` aufteilen muss, und dass `ege` für Eingabe steht und `durch` für Durchgänge, dann sollte man das doch verdammt noch eins einfach `eingabedurchgaenge` nennen.

`buttonokClick` ist auch ein komisches Wort. Nach dem zweiten hinsehen rate ich mal das soll `button` und `ok` sein. Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Alles was eine Funktion oder Methode ausser Konstanten benötigt, wird als Argument(e) übergeben. Die Funktion braucht also das `Entry`-Objekt als Argument. Momentan sieht das so aus als wäre das eine globale Variable → verwende keine globalen Variablen!

Ob die Zeichenkette eine Gleitkommazahl darstellt, sieht man ja daran ob der `float()`-Aufruf einen `ValueError` auslöst oder nicht.

In ein leeres `Entry` eine leere Zeichenkette einzufügen ist komplett sinnfrei.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from functools import partial

...


def on_ok_button(eingabedurchgaenge_entry):
    try:
        eingabedurchgaenge = float(eingabedurchgaenge_entry.get())
    except ValueError:
        print("Fehler")
    else:
        print("ok")
        print(eingabedurchgaenge)
        eingabedurchgaenge_entry.delete(0, tk.END)
        print("ok ende")


def main():
    ...
    eingabedurchgaenge_entry = tk.Entry(...)
    ...
    ok_button = tk.Button(
        ..., command=partial(on_ok_button, eingabedurchgaenge_entry)
    )
    ...
Mit `functools.partial()` alleine kommt man allerdings nicht besonders weit. Bei jeder nicht-trivialen GUI kommt man um objektorientierte Programmierung (OOP) nicht herum.

Bei einer Zahl die Durchgänge repräsentiert, hätte ich vom Gefühl her eine ganz Zahl erwartet‽
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
3D_Schorsch
User
Beiträge: 4
Registriert: Montag 6. April 2020, 13:19

Hallo,
@__blackjack__ , erstmal Danke für die Hilfe.
Ich habe deine Methode mal in mein Skript eingebaut, es funktioniert alles ganz gut bis ich was in mein Textfeld eingebe und mit ok bestätige.
Danach folgt diese Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: on_ok_button() missing 1 required positional argument: 'eingabedurchgaenge_entry'
Es wäre toll wenn @__blackjack__ oder jemand anders mir weiterhelfen könnte.

Danke schon im Voraus für den großartigen Support.

LG
3D_Schorsch


Mein vollständiger Code (ich hoffe er ist verständlich genug, denn ich habe erst mit Python bzw. mit tkinter angefangen):

Code: Alles auswählen

from tkinter import *
#Erzeugung des Fensters
root = Tk()
root.title("Temperatur und Luft")
#root.geometry("400x145")
XPOS = 500
YPOS = 250
root.geometry("+%d+%d" % (XPOS, YPOS))


def on_ok_button(eingabedurchgaenge_entry):
    try:
        eingabedurchgaenge = float(eingabedurchgaenge_entry.get())
    
    except ValueError:
        print("Fehler")
    else:
        print("ok")
        print(eingabedurchgaenge)
        eingabedurchgaenge_entry.delete(0, tk.END)
        print("ok ende")



#Label für die Anzeige der Daten
lable1 = Label(master=root, text="Bitte Durchlaufe und Dauer pro Durcklauf angeben", fg="black", font=("Arial", 10))
#lable1.place(x=30, y=5, width=300, height=20)
lable1.grid(row=0, column=1)


lable2 = Label(root, text="Durchläufe:", fg="black", font=("Arial", 10))
lable2.grid(row=2, column=0)

leer1 = Label(root, text="")
leer1.grid(row=3, column=0)

leer2 = Label(root, text="")
leer2.grid(row=4, column=0)

leer3 = Label(root, text="")
leer3.grid(row=5, column=0)
#Button
ok_button = Button(root, text="OK", fg="black", bg="#FFFFFF", command=on_ok_button)
#(on_ok_button, eingabedurchgaenge_entry)
ok_button.grid(row=6, column=1)

#entry
eingabedurchgaenge = Entry(root, bg="#FFFFFF", text="Durchlaufe")
eingabedurchgaenge.grid(row=2, column=1)

root.mainloop()

Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@3D_Schorsch: Naja offensichtlich übergibst Du da das `Entry`-Objekt nicht in Deinem Code. In meinem Code mache ich das.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
3D_Schorsch
User
Beiträge: 4
Registriert: Montag 6. April 2020, 13:19

__blackjack__ hat geschrieben: Dienstag 7. April 2020, 20:28 @3D_Schorsch: Naja offensichtlich übergibst Du da das `Entry`-Objekt nicht in Deinem Code. In meinem Code mache ich das.
Ok und wo füge ich das „Entry“-Objekt ein?
LG
3D_Schorsch
Antworten