pygame中出现'Surface'对象无'image'属性的AttributeError求助
问题原因分析
错误的核心是你在这段代码中破坏了vector列表的元素类型:
for i in range(len(vector)): vector[i] = pygame.transform.scale(vector[i].image, (100, 100))
原本vector中存储的是Piece类的实例,但上述循环将每个元素直接替换成了pygame.transform.scale()返回的Surface对象。当后续draw_pieces函数遍历vector时,循环变量Piece实际是Surface类型,它没有.image和.pos属性,因此触发AttributeError。
解决方案
提供两种可行的修复方式:
方式一:修改Piece实例的image属性(推荐)
不要替换整个Piece实例,而是更新实例内部的.image属性为缩放后的Surface:
# 替换原来的错误循环 for piece in vector: piece.image = pygame.transform.scale(piece.image, (100, 100))
这样vector中始终保存的是Piece实例,draw_pieces函数可以正常访问.image和.pos属性。
方式二:提前缩放图片再创建Piece实例
在加载图片后直接缩放,再传入Piece的构造函数:
# 加载并缩放所有棋子图片 b_bi = pygame.transform.scale(pygame.image.load("Chess_bdt45.svg.png"), (100, 100)) w_bi = pygame.transform.scale(pygame.image.load("Chess_blt45.svg.png"), (100, 100)) b_k = pygame.transform.scale(pygame.image.load("Chess_kdt45.svg.png"), (100, 100)) w_k = pygame.transform.scale(pygame.image.load("Chess_klt45.svg.png"), (100, 100)) # 其他棋子图片同理执行加载+缩放操作... # 后续正常创建Piece实例并添加到vector b_r1= Piece((0,0),b_r,False) # ...其余实例创建代码不变
这种方式避免了后续修改vector的操作,逻辑更清晰。
额外的小问题提示
w_p1= Piece((8,6),w_r,False):棋盘坐标范围通常是0-7,(8,6)会导致棋子绘制出界,建议修正为合法坐标(比如(0,6))。b_r2= Piece((7,0),b_p,False):这里传入的图片是b_p(黑兵),但变量名是b_r2(黑车),属于传参错误,建议改为b_r。
内容的提问来源于stack exchange,提问作者T4 Vertix oli
相关产品推荐
相关产品推荐

