2013-08-11 1 views
6

У меня возникли некоторые проблемы с операторами try и except, у меня есть виджет ввода, который принимает входные данные в строках, но у меня есть код, который преобразует его в целое число позже. если пользователь вводит что-то вроде текста, то он выдает сообщение об ошибке, как это:Локальная переменная, на которую ссылаются перед присваиванием с помощью оператора try и 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' 

Так что я хотел, чтобы скрыть ошибку с попыткой и, кроме заявлений, но теперь я получаю другое сообщение об ошибке.

Это то, на что похоже в коде.

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

Новое сообщение об ошибке:

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 

Я не могу понять, почему это происходит и как это исправить, так что любая помощь будет оценена.

Заранее спасибо.

ответ

5

Если в вашем блоке try/except есть исключение, не было бы entryx и entryy переменных, определенных в области.

Вы должны либо бросить, либо выйти из программы, либо назначить entryx и entryy значениям по умолчанию в блоке except.

Кроме того, вы можете сделать цикл while до тех пор, пока пользователь не вводит целое число, как было предложено here.

0

вы можете увидеть сообщение «текст».
так, исключение было поднято, а entryx не был инициализирован.
, поэтому у вас есть:

local variable 'entryx' referenced before assignment 
4

Чтобы добавить @alecxe's answer, я предпочел бы изменить программу так:

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

В принципе, то, что ошибка означает, что в случае ошибки , entryx, entryy никогда не получают ничего назначенного, но все равно получите ссылку позже в тесте if..else.

Лучше иметь значения по умолчанию для переменных вне блока try..except.

1

Я бы инициализировал answerx, answery с None перед запуском блока try.

Смежные вопросы