绘制越界时出现溢出错误

问题描述 投票:0回答:1

当我将鼠标移到我在 tkintre 中绘制的边界之外时,会出现错误

> Exception in Tkinter callback
Traceback (most recent call last):
  File "c:\Users\My PC\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1962, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "c:\Windows\System32\awdkhjgeuyfsbiufhefse.py", line 4, in <lambda>   
    K=__import__('tkinter');m=K.Tk();R,C,z,p=50,50,10,0;l=[[0]*C for _ in range(R)];c=K.Canvas(m,w=C*z,he=R*z,bg='#0c0c0c');c.pack();[c.create_line(0,i*z,C*z,i*z,fill='#1a1a1a')for i in range(R)];[c.create_line(j*z,0,j*z,R*z,fill='#1a1a1a')for j in range(C)];c.bind("<B1-Motion>",lambda e:d(e.x//z,e.y//z));m.bind("<space>",t);m.mainloop()
                                                                                                     
                                                                                                     
                                                                                       ^^^^^^^^^^^^^^^^
  File "c:\Windows\System32\awdkhjgeuyfsbiufhefse.py", line 1, in d
    def d(x,y):global l;l[y][x]=1;c.create_rectangle(x*z,y*z,(x+1)*z,(y+1)*z,fill='#fff',outline='') 
                        ~~~~^^^
IndexError: list assignment index out of range

代码是:

def d(x,y):global l;l[y][x]=1;c.create_rectangle(x*z,y*z,(x+1)*z,(y+1)*z,fill='#fff',outline='')
def t(_=None):global p;p^=1;['',u()][p]
def u():global l,K;l=[[1 if(l[y][x]==1 and sum(l[y+dy][x+dx]for dx,dy in((dx,dy)for dx in(-1,0,1)for dy in(-1,0,1)if(dx,dy)!=(0,0))if 0<=x+dx<C and 0<=y+dy<R)in(2,3))or(l[y][x]==0 and sum(l[y+dy][x+dx]for dx,dy in((dx,dy)for dx in(-1,0,1)for dy in(-1,0,1)if(dx,dy)!=(0,0))if 0<=x+dx<C and 0<=y+dy<R)==3)else 0 for x in range(C)]for y in range(R)];K=__import__('tkinter');c.delete("all");[c.create_line(0,i*z,C*z,i*z,fill='#1a1a1a')for i in range(R+1)];[c.create_line(j*z,0,j*z,R*z,fill='#1a1a1a')for j in range(C+1)];[[c.create_rectangle(x*z,y*z,(x+1)*z,(y+1)*z,fill='white',outline='')for x in range(C)if l[y][x]]for y in range(R)];m.after(100,u) if p else None
K=__import__('tkinter');m=K.Tk();R,C,z,p=50,50,10,0;l=[[0]*C for _ in range(R)];c=K.Canvas(m,w=C*z,he=R*z,bg='#0c0c0c');c.pack();[c.create_line(0,i*z,C*z,i*z,fill='#1a1a1a')for i in range(R)];[c.create_line(j*z,0,j*z,R*z,fill='#1a1a1a')for j in range(C)];c.bind("<B1-Motion>",lambda e:d(e.x//z,e.y//z));m.bind("<space>",t);m.mainloop()

如何修复这个错误?

我尝试运行代码

python tkinter
1个回答
0
投票

更新列表l之前需要确保获取到的坐标在网格范围内。

您可以修改

d
函数来处理超出范围的坐标,例如:

def d(x, y):
  global l
# Check if the coordinates are within the grid range
  if 0 <= x < C and 0 <= y < R:  
      l[y][x] = 1
      c.create_rectangle(x * z, y * z, (x + 1) * z, (y + 1) * z, fill='#fff', outline='')
© www.soinside.com 2019 - 2024. All rights reserved.