2013-08-11 13 views
6

Ich habe einige Probleme mit den try und exception-Anweisungen, ich habe ein Eintrag-Widget, das Eingabe in Strings, aber ich habe Code, der es später in eine Ganzzahl konvertiert, Problem ist wenn die Benutzereingaben so etwas wie Text ein Fehler wie dieser wirft:Lokale Variable referenziert vor der Zuweisung mit try und except

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python3.2/tkinter/__init__.py", line 1402, in __call__ 
    return self.func(*args) 
    File "/home/ppppwn3d/workspace/Python/JailBreakBob/JailBreakBob.py", line 157, in buttonclick_gamescreen 
    entryx = int(e1.get()) 
ValueError: invalid literal for int() with base 10: 'abc' 

Also wollte ich den Fehler mit dem Versuch und außer Aussagen verstecken, aber ich nun eine andere Fehlermeldung.

So sieht es im Code aus.

while pressed == 8 : 
     try: 
      entryx = int(e1.get()) 
      entryy = int(e2.get()) 
     except ValueError: 
      print("text") 

     answerx = answerlistx[randomimage] 
     answery = answerlisty[randomimage] 

     if entryx == answerx and entryy == answery 
      canvas.delete(images) 
      randomimage = random.randrange(0,49+1) 
      scorecounter = scorecounter + 1 
      game = PhotoImage(file=imagelist[randomimage]) 
      images = canvas.create_image(30, 65, image = game, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 
     if entryx > 10 or entryx < -10 or entryy > 10 or entryy < -10 : 
      wrong = canvas.create_image(30, 65, image = outside, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 
     else: 
      wrong = canvas.create_image(30, 65, image = incorrect, anchor = NW) 
      e1.delete(0, END) 
      e2.delete(0, END) 
      pressed = '' 

Die neue Fehlermeldung:

text 
Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python3.2/tkinter/__init__.py", line 1402, in __call__ 
    return self.func(*args) 
    File "/home/ppppwn3d/workspace/Python/JailBreakBob/JailBreakBob.py", line 165, in buttonclick_gamescreen 
    if entryx == answerx and entryy == answery: 
UnboundLocalError: local variable 'entryx' referenced before assignment 

ich kann nicht herausfinden, warum dies geschieht und wie es zu beheben, so würde jede Hilfe dankbar.

Vielen Dank im Voraus.

Antwort

5

Wenn in Ihrem try/except-Block eine Ausnahme vorhanden ist, sind im Bereich keine Variablen entryx und entryy definiert.

Sie sollten entweder werfen und Fehler und beenden Sie das Programm oder zuweisen entryx und entryy Standardwerte im except Block.

Sie können auch eine while-Schleife erstellen, bis der Benutzer eine Ganzzahl eingibt, wie sie here vorgeschlagen wurde.

0

können Sie 'Text' Nachricht sehen.
so wurde die Ausnahme ausgelöst und entryx wurde nicht initialisiert.
Deshalb sollten Sie haben:

local variable 'entryx' referenced before assignment 
4

zu @alecxe's answer hinzuzufügen, würde ich lieber das Programm modifizieren, wie so:

entryx, entryy = 0, 0 
    try: 
     entryx = int(e1.get()) 
     entryy = int(e2.get()) 
    except ValueError: 
     print("text") 

Im Grunde, was der Fehler bedeutet, dass im Falle eines Fehlers , entryx, entryy nie etwas zugewiesen bekommen, aber immer noch später in der if..else überprüfen verwiesen werden.

Es ist am besten, Standardwerte für die Variablen außerhalb des Blocks try..except zu haben.

1

Ich würde answerx, die Antwort mit None vor dem Versuch Block beginnt initialisieren.

Verwandte Themen