Python Tkinter代码运行报IndexError列表索引越界错误的原因及修复方法
报错原因
- 未正确存储画布矩形的ID:你定义的
rectangle是自定义函数名,不是canvas.create_rectangle()返回的图形元素唯一ID。调用canvas.coords(rectangle)时无法匹配到对应的画布元素,获取到的坐标列表要么为空,要么长度不符合预期。 - 索引超出列表范围:即使正确获取到矩形的坐标,
canvas.coords()返回的单个矩形坐标是长度为4的列表,对应[左上角x坐标, 左上角y坐标, 右下角x坐标, 右下角y坐标],合法索引仅为0/1/2/3,你调用surdsk[20]远超出了列表的最大索引值,直接触发越界报错。
修复方案
修改逻辑如下:
- 调整
rectangle函数,返回创建的矩形ID,用变量存储供后续操作使用 - 左移边界判断改为取矩形左上角x坐标(对应索引0),判断是否大于画布左边界阈值
- 所有操作画布元素的方法都传入正确的矩形ID,而非函数名
修复后的完整代码:
from tkinter import * import random def rectangle(): # 返回创建的矩形ID return canvas.create_rectangle(20, 20, 20+20, 20+30, fill='red') def MoveLeft(action): surdsk = canvas.coords(rect_id) # 取左上角x坐标判断是否大于左边界阈值5 if surdsk[0] > 5: canvas.move(rect_id, -10, 0) canvas = Canvas() canvas.pack() canvas.bind_all('<Key-Left>', MoveLeft) # 存储矩形ID到全局变量 rect_id = rectangle() mainloop()
内容的提问来源于stack exchange,提问作者Adask
相关产品推荐
相关产品推荐

