2017-09-04 3 views
2

Je suis en train de coder un programme simple qui convertit unités impériales en unités métriques. Cependant, lorsque j'utilise une commande Entry.get(), je dois le convertir en un entier et lorsque je tente de fairePython 3: Tkinter: Comment modifier Entry.get() en entier

Je reçois cette erreur:

Traceback (most recent call last): 
    File "C:/Users/Bill/converter.py", line 18, in <module> 
    conversion=int(e.get()) 
ValueError: invalid literal for int() with base 10: '' 

J'ai essayé de lancer une version extrêmement basique de ce que je faisait (ce qui est écrit ci-dessous), mais cela a encore causé la même erreur.

import tkinter 
root= tkinter.Tk() 

e=tkinter.Entry(root) 
e.pack() 

b=tkinter.Button(root, command= lambda: print(e.get())) 
b.pack() 

conversion=int(e.get()) 
conversion= conversion* 1.8 +32 
l = tkinter.Label(root, text=conversion) 

top.mainloop() 

Je récemment commencé à coder à nouveau, donc la réponse est probablement quelque chose très simple que j'ai manqué, mais merci pour toutes les réponses.

+0

Vous appelez ' e.get() 'une milliseconde après avoir créé le widget. L'utilisateur n'a pas le temps d'entrer des données. –

Répondre

2

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() 
+0

Lorsque je change mon code avec l'aide de votre réponse, cela ne fonctionne toujours pas et j'obtiens le même message d'erreur, mais il n'en imprime aucun lorsque la valeur n'est pas un nombre entier. L'erreur pointe sur cette ligne: 'conversion = int (e.get())'. Comment puis-je réparer cela? Merci –

+0

Vous devez vous débarrasser de ce 'int (e.get())'. Il devrait être remplacé par 'get_value (e)'. Le problème est qu'une conversion directe en 'int' déclenchera une erreur, qui ne sera pas détectée. Envelopper cette conversion comme je l'ai fait dans une fonction permettra d'attraper l'erreur. –

+0

@BillR S'il vous plaît vérifier ma modification. Je vous ai donné un code qui fonctionne. J'espère que cela vous aidera à comprendre les bases d'une interface graphique. –

0

Essayez ce code:

import sys 

if sys.version_info.major < 3: # for Python 2.x 
    import Tkinter as tk 
else: # for Python 3.x 
    import tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.master.title("Conversion application") 
     self.master.geometry("300x100") 
     self.x = tk.IntVar() 
     self.grid() 
     self.createWidgets() 

    def createWidgets(self): 
     self.e = tk.Entry(self, textvariable=self.x) 
     self.e.bind('<Return>', self.convert) 
     self.e.focus() 
     self.e.grid() 
     self.b = tk.Button(self, text="Convert", command=self.convert) 
     self.b.grid() 
     self.l = tk.Label(self) 
     self.l.grid() 

    def convert(self, event=None): 
     try: 
      print(self.x.get()) 
      conversion = self.x.get() 
      conversion = conversion * 1.8 + 32 
      self.l.config(text=conversion) 
     except tk.TclError: 
      self.l.config(text="Not an integer") 

app = Application() 
app.mainloop()