You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:05:33