Le problème, et ce que l'erreur indique, est que la chaîne vide ''
ne peut pas être convertie en nombre entier.
En fait, beaucoup de chaînes ne peuvent pas être converties en nombre entier. Dans votre cas, int(e.get())
déclenche une erreur car l'entrée est vide, mais int('')
déclenche une erreur. Par conséquent, vous devez valider votre entrée avant de la convertir, afin de la traiter uniquement lorsqu'elle contient la représentation sous forme de chaîne d'un entier.
Vous pouvez envelopper un try
-except
dans une fonction get_value
:
def get_value(entryWidget):
value = entryWidget.get()
try:
return int(value)
except ValueError:
return None
Ensuite, au lieu de mettre en lambda: print(e.get())
comme un rappel à votre bouton, passer lambda: print(get_value(e))
. Si la valeur peut être analysée en tant qu'entier, le résultat de int(e.get())
est imprimé. Si ce n'est pas le cas, cela affichera None
.
Voici la version modifiée de votre code:
import tkinter
root= tkinter.Tk()
def get_value(entryWidget):
value = entryWidget.get()
try:
return int(value)
except ValueError:
return None
e = tkinter.Entry(root)
e.pack()
b = tkinter.Button(root, command=lambda: print(e.get()))
b.pack()
conversion = get_value(e)
if conversion is not None:
conversion *= 1.8 + 32
l = tkinter.Label(root, text=conversion)
top.mainloop()
Ceci, cependant, est un peu maladroit. Étant donné que le contenu de l'entrée est intercepté avant la boucle principale, cette dernière sera toujours vide. En ce qui concerne les interfaces graphiques, vous ne pouvez pas penser séquentiellement comme vous le faites habituellement. Vous devriez plutôt demander à votre bouton pour mettre à jour le contenu de votre étiquette lorsqu'il est pressé, de façon à avoir afficher le résultat de la conversion:
import tkinter
def get_value(entryWidget):
value = entryWidget.get()
try:
return int(value)
except ValueError:
return None
def convert(value):
if value is None:
return None
else:
return 1.8*value + 32
def set_label_text(label, entry):
value = convert(get_value(entry))
if value is None:
label['text'] = "Enter an integer"
else:
label['text'] = value
root = tkinter.Tk()
e = tkinter.Entry(root)
l = tkinter.Label(root, text="")
b = tkinter.Button(root, text="Convert", command=lambda: set_label_text(l, e))
e.pack()
l.pack()
b.pack()
root.mainloop()
Vous appelez ' e.get() 'une milliseconde après avoir créé le widget. L'utilisateur n'a pas le temps d'entrer des données. –