13

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 ステートメントと except ステートメントでエラーを非表示にしたかったのですが、別のエラー メッセージが表示されるようになりました。

これは、コードでどのように見えるかです。

    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

これがなぜ起こっているのか、それを修正する方法がわかりませんので、助けていただければ幸いです。

4

4 に答える 4

13

@alecxeの回答に追加するには、プログラムを次のように変更します。

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

基本的に、エラーが意味することは、エラーが発生した場合、entryx, entryy何も割り当てられず、後でif..elseチェックで参照されることです。

try..exceptブロックの外側の変数には既定値を設定することをお勧めします。

于 2013-08-11T10:00:39.367 に答える
10

ブロックに例外がある場合、スコープに定義された変数はありtry/exceptません。entryxentryy

スローしてエラーを出してプログラムを終了するか、ブロックentryxentryyデフォルト値を割り当ててください。except

また、ここで提案されているように、ユーザーが整数を入力するまで while ループを作成することもできます。

于 2013-08-11T09:55:14.223 に答える
2

try ブロックが開始する前に、answerx、answery を None で初期化します。

于 2013-08-11T10:04:35.930 に答える
0

「テキスト」メッセージが表示されます。
そのため、例外が発生し、entryx は初期化されませんでした。
それがあなたが持っている理由です:

local variable 'entryx' referenced before assignment
于 2013-08-11T09:56:39.307 に答える