2013-08-11 11 views
6

Mam pewne problemy z instrukcjami try i except, mam widżet wpisu, który pobiera dane wejściowe w łańcuchach, ale mam kod, który konwertuje go na liczbę całkowitą później, problem jest jeśli dane wprowadzane przez użytkownika coś takiego tekstu zgłasza błąd podobny do tego:zmienna lokalna przywoływana przed przypisaniem z instrukcją try i except z wyjątkiem

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' 

Więc chciałem ukryć błąd przy próbie oraz z wyjątkiem sprawozdania, ale teraz się kolejny komunikat o błędzie.

Tak właśnie wygląda w kodzie.

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 = '' 

Nowy komunikat o błędzie:

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 

Nie mogę zrozumieć, dlaczego tak się dzieje i jak to naprawić, więc każda pomoc będzie mile widziane.

Z góry dziękuję.

Odpowiedz

5

Jeśli w Twoim bloku istnieje wyjątek, w jego zasięgu nie będą zdefiniowane zmienne entryx i entryy.

Powinieneś rzucić i pomyłkę i wyjść z programu lub przypisać domyślne wartości entryx i entryy w bloku except.

Możesz również zrobić pętlę, dopóki użytkownik nie wprowadzi liczby całkowitej, tak jak sugerowano here.

0

możesz zobaczyć wiadomość tekstową.
, więc został zgłoszony wyjątek i nie zainicjowano entryx.
dlatego masz:

local variable 'entryx' referenced before assignment 
4

Aby dodać do @alecxe's answer, wolałbym zmodyfikować program tak:

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

Zasadniczo, co błędu oznacza to, że w przypadku błędu , entryx, entryy nigdy nie zostanie przypisany do niczego, ale nadal będzie można się z nim zapoznać później w sprawdzeniu if..else.

Najlepiej mieć domyślne wartości zmiennych poza blokiem try..except.

1

Inicjuję system answerx, odpowiadający brakiem przed rozpoczęciem bloku try.

Powiązane problemy