Python pygame报错:Object has no attribute 'get_width' 求助
问题分析与解决:封装类后调用image.get_width()报错
核心原因
你遇到的问题本质是Myexperiment类中的image属性没有被正确初始化为pygame的Surface对象——get_width()是pygame Surface独有的方法,如果image是字符串(比如图片路径)、None或其他非Surface类型,调用该方法必然会报错。
常见错误场景与修正方案
1. 直接赋值图片路径而非加载后的Surface
错误代码示例:
import pygame class Myexperiment: def __init__(self): # 错误:仅赋值路径,未加载为Surface self.image = "player.png" pygame.init() screen = pygame.display.set_mode((800, 600)) exp = Myexperiment() exp.image.get_width() # 报错:'str' object has no attribute 'get_width'
修正后代码:
import pygame class Myexperiment: def __init__(self, img_path): # 正确加载图片为Surface对象,convert_alpha保留透明通道 self.image = pygame.image.load(img_path).convert_alpha() pygame.init() screen = pygame.display.set_mode((800, 600)) exp = Myexperiment("player.png") print(exp.image.get_width()) # 正常输出图片宽度
2. 初始化分支中未给image赋值
如果__init__里有条件判断,某些分支下self.image未被赋值,会导致它为None:
class Myexperiment: def __init__(self, load_img): if load_img: self.image = pygame.image.load("player.png") # 未处理else分支,self.image为None exp = Myexperiment(False) exp.image.get_width() # 报错:'NoneType' object has no attribute 'get_width'
修正:确保所有分支都初始化self.image,比如给默认值或强制加载:
class Myexperiment: def __init__(self, load_img=True, default_img="default.png"): if load_img: self.image = pygame.image.load("player.png").convert_alpha() else: self.image = pygame.image.load(default_img).convert_alpha()
3. 变量名拼写错误
比如类内初始化的是self.img,但调用时写成了self.image.get_width(),此时self.image是未定义的属性,本质还是非Surface对象。检查变量名拼写一致性即可解决。
排查建议
- 在调用
get_width()前,打印type(exp.image)确认其类型——如果不是<class 'pygame.Surface'>,说明初始化逻辑有问题。 - 检查
pygame.image.load()的路径是否正确,路径错误会抛出异常,若未捕获可能导致self.image未被正确赋值。
内容的提问来源于stack exchange,提问作者Steven Murray
相关产品推荐
相关产品推荐

