Python代码报错TypeError: sound()缺少必选参数objectS求助
问题分析与解决
你遇到的TypeError是典型的实例方法与类方法调用混淆导致的,具体原因和修复方案如下:
错误根源
_Warning类中的sound()是一个实例方法,它的第一个参数self必须接收该类的一个实例对象。但你在代码里直接用类名_Warning调用它:
_Warning.sound(1)
这时候Python会把你传入的1当作self参数,而原本需要的objectS参数就缺失了,所以抛出了"missing 1 required positional argument: 'objectS'"的错误。
修复步骤
保存Warning实例的引用
在warnings()方法中创建_Warning实例时,把它赋值给一个变量,这样后续才能用这个实例调用方法:# 替换原来的 _Warning(self, 1) self.current_warning = _Warning(self, 1)用实例调用sound方法
把原来的_Warning.sound(1)改成用保存的实例调用:self.current_warning.sound(1)同理,后续处理第二个警告时,也要先保存新的实例再调用方法:
# 替换原来的 _Warning(2) self.current_warning = _Warning(self, 2) # 调用sound self.current_warning.sound(2)额外优化建议
- 你的
_Warning类在__init__里每次都会重复加载图片和声音文件,这会浪费资源,建议把这些资源放到类级别变量中,只加载一次:class _Warning(pg.sprite.Sprite): # 类变量,仅初始化一次 warningImage_1 = pg.image.load("wra.png") warningImage_2 = pg.image.load("wrb.png") warningSound_1 = py.media.load("wra.mp3") warningSound_2 = py.media.load("wra.mp3") def __init__(self, game, objectI): self.groups = game.warningGroups pg.sprite.Sprite.__init__(self, self.groups) self.game = game self.player = py.media.Player() if objectI == 1: self.image = self.warningImage_1 elif objectI == 2: self.image = self.warningImage_2 self.image = pg.transform.scale(self.image, (self.game.wMainDisplay, self.game.hMainDiplay)) self.rect = self.image.get_rect() self.rect.x = 0 self.rect.y = 0 - 注意
py.app.run()会启动pyglet的独立事件循环,可能会阻塞你的Pygame主循环,建议改用pyglet.media.Player的play()配合Pygame的循环逻辑,避免两个事件循环冲突。
- 你的
内容的提问来源于stack exchange,提问作者Rebagliati Loris
相关产品推荐
相关产品推荐

