Python 如何找出我的未处理异常是什么

Python 如何找出我的未处理异常是什么,python,exception,exception-handling,tkinter,Python,Exception,Exception Handling,Tkinter,这可能是有史以来最愚蠢的问题,但我完全不知道我遇到了什么例外,我只知道我遇到了一个例外,谷歌不想让我知道为什么 它是这样说的: Unhandled exception in thread started by <function draw at 0x02A403B0> 仅用于调试,我会将整个内容包含在一个try except中,打印异常并重新引发它: def draw(): try: while True: for x in rang

这可能是有史以来最愚蠢的问题,但我完全不知道我遇到了什么例外,我只知道我遇到了一个例外,谷歌不想让我知道为什么

它是这样说的:

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

仅用于调试,我会将整个内容包含在一个
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

仅用于调试,我会将整个内容包含在一个
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

除了运行mainloop的线程外,不能从任何线程调用Tkinter对象。相反,您应该删除线程的使用,并删除无限循环的使用。相反,可以这样做(尽管我不知道我和j来自何方,我只是在复制您的代码…):

这利用了一个事实,即您已经有一个无限循环在运行——事件循环。调用draw的事件循环的每次迭代(或者更准确地说,事件循环中每30毫秒一次)


然而,这段代码看起来将是一个真正的内存消耗。你真的打算继续每30毫秒创建一个新的矩形吗?最终会出现性能问题,因为最终会出现成千上万个重叠的矩形

Tkinter对象不能从运行mainloop的线程以外的任何线程调用。相反,您应该删除线程的使用,并删除无限循环的使用。相反,可以这样做(尽管我不知道我和j来自何方,我只是在复制您的代码…):

这利用了一个事实,即您已经有一个无限循环在运行——事件循环。调用draw的事件循环的每次迭代(或者更准确地说,事件循环中每30毫秒一次)



然而,这段代码看起来将是一个真正的内存消耗。你真的打算继续每30毫秒创建一个新的矩形吗?最终会出现性能问题,因为最终会出现成千上万个重叠的矩形

除了运行
mainloop
的线程之外,你不能在其他线程中运行tkinter函数。我看不到
的任何结束,而这是真的
,你的意思是让睡眠在while中吗?@BryanOakley我不可能以这种方式不断更新矩形并运行mainloop吗?@Endophage是的,它应该根据2D数组中的数字在10x10的网格中不断绘制矩形,并且睡眠是为了每秒的更新不会使数据过载CPU@Eykar:无法从其他线程更新三角形。通常的方法是创建一个函数来更新显示,然后让该函数在之后每隔几毫秒调用一次。删除
while True:
语句,然后添加
canvas.after(30,draw)
。一旦你调用
draw
一次,它将继续每30毫秒调用一次自身。除了运行
mainloop
的线程外,您不能在其他线程中运行tkinter函数。我看不到该
的结束,而True
为真,您的意思是睡眠在while内吗?@BryanOakley我不可能不断更新其中的矩形吗运行mainloop的方法?@Endophage是的,它应该根据2D数组中的数字在10x10的网格中不断绘制矩形,并且睡眠是为了每秒的更新不会过载CPU@Eykar:无法从其他线程更新三角形。通常的方法是创建一个函数来更新显示,然后让该函数在之后每隔几毫秒调用一次。删除
while True:
语句,然后添加
canvas.after(30,draw)
。一旦您调用
draw
一次,它将继续每隔30毫秒调用一次。谢谢!这是完美的:D结果是例外#1是我在使用x和y时使用了coord[i][j]。哦,谢谢你!这是完美的:D结果是例外#1是我在使用x和y时使用了coord[i][j]。哎呀,i和j是错误的,我想用x和y,因为我在处理坐标,坐标表中的i和j是习惯的力量。是的,我只是意外地让它运行了几分钟,我的计算机对此不满意,我以前不知道canvas.itemconfig(),所以我猜在我创建了所有100个矩形之后,我可以使用它来简单地更改颜色。我现在必须睡觉了,明天我会试试:)好的,我才刚开始做这个,为什么这个方法比以前的方法更有效?它不是每30个就创建100个矩形吗milliseconds@Eykar:是的,它仍然创建所有这些矩形。重点是说明在不导致GUI睡眠的情况下绘制间隔的正确方法。我无法知道是否需要创建所有这些矩形。I和j是错误的,我想使用x和y,因为我在处理坐标,坐标列表中的I和j是习惯的力量。是的,我只是意外地让它运行了几分钟,我的计算机对此不满意,我以前不知道canvas.itemconfig(),所以我猜在我创建了所有100个矩形之后,我可以使用它来简单地更改颜色。我现在必须睡觉了,明天我会试试:)好的,我才刚开始做这个,为什么这个方法比以前的方法更有效?它不是每30个就创建100个矩形吗milliseconds@Eykar:是的,它仍然创建所有这些矩形。重点是说明在不导致GUI睡眠的情况下绘制间隔的正确方法。我无法知道是否需要创建所有这些矩形。
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)