1

これはおそらくこれまでで最もばかげた質問ですが、私が得ている例外が何であるかはまったくわかりません。私が知っているのは、私がそれを取得していることだけであり、グーグルは私に理由を知らせたくありません。

これがそれが言うことです:

Unhandled exception in thread started by <function draw at 0x02A403B0>

そして、これが原因ですが、誰かが私の悪いコードで何が起こっているのか教えてくれるといいのですが、これがとても起こるので、次にこれが起こったときにどうやって自分自身を見つけることができるかを知りたいです。

def draw():
    while True:
        for x in range(0,10):
            for y in range (0,10):
                if (coord[x][y] == 0):
                    canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="white")
                if (coord[x][y] == 1):
                    canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="red")
                if (coord[x][y] == 2):
                    canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="darkorange")
    time.sleep(0.03)
4

2 に答える 2

4

デバッグの場合のみ、try-except例外を印刷して再発生させることですべてを囲みます。

def draw():
    try:
        while True:
            for x in range(0,10):
                for y in range (0,10):
                    if (coord[i][j] == 0):
                        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="white")
                    if (coord[i][j] == 1):
                        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="red")
                    if (coord[i][j] == 2):
                        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="darkorange")
        time.sleep(0.03)
    except Exception as e:
        print(e)
        raise
于 2013-03-06T21:55:56.513 に答える
1

Tkinterオブジェクトは、mainloopが実行されているスレッド以外のスレッドから呼び出すことはできません。代わりに、スレッドの使用を削除し、無限ループの使用を削除する必要があります。代わりに、次のようなことを行ってください(ただし、iとjがどこから来ているのかはわかりませんが、コードをコピーしているだけです...):

def draw():
    for x in range(0,10):
        for y in range (0,10):
            item = canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, 
                                           (x * 40) + 50, (y * 40) + 50)
            if (coord[i][j] == 0):
                canvas.itemconfig(item, fill="white")
            if (coord[i][j] == 1):
                canvas.itemconfig(item, fill="red")
            if (coord[i][j] == 2):
                canvas.itemconfig(item, fill="darkorange")
    canvas.after(30, draw)

これは、すでに無限ループが実行されているという事実、つまりイベントループを利用しています。描画を呼び出すイベントループのすべての反復(より正確には、イベントループの30ミリ秒ごと)。

ただし、このコードは実際のメモリを大量に消費するように見えます。本当に30ミリ秒ごとに新しい長方形を作成し続けるつもりですか?最終的には、数十万の長方形が重なってしまうため、パフォーマンスの問題が発生します。

于 2013-03-06T22:37:43.910 に答える