2013-08-11 11 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' 

だから私は、tryとし、文以外のエラーを非表示にしたかったのですが、私は今、別のエラーメッセージが表示されます。

これはコード内のようです。

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ブロックに例外がある場合、entryxentryy変数がスコープ内で定義されていません。

exceptブロックには、エラーをスローしてプログラムを終了するか、entryxentryyのデフォルト値を割り当てる必要があります。

また、hereのようにユーザーが整数を入力するまでwhileループを作成できます。

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で初期化します。