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

除了运行 mainloop 的线程之外,不能从任何线程调用 Tkinter 对象。相反,您应该删除线程的使用,并删除无限循环的使用。相反,做这样的事情(虽然,我不知道 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 毫秒)您调用 draw。

然而,这段代码看起来会是一个真正的内存猪。你真的打算每 30 毫秒继续创建新的矩形吗?最终你会遇到性能问题,因为你最终会得到数十万个重叠的矩形。

于 2013-03-06T22:37:43.910 回答