这可能是有史以来最愚蠢的问题,但我完全不知道我得到的异常是什么,我所知道的是我得到一个而谷歌不想让我知道为什么。
以下是它的说法:
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)
答案 0 :(得分: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
答案 1 :(得分: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毫秒继续创建一个新的矩形吗?最终你会遇到性能问题,因为你最终会得到数十万个重叠的矩形。