Python类内无法调用自身方法问题求助(Pygame按钮类场景)
刚接触Python类确实容易忽略self的重要性,你的问题核心就是在类的实例方法内部,调用自身的方法或属性时必须加上self.前缀,否则Python会把它们当成全局名称,从而抛出NameError。我帮你梳理并修正了代码里的问题:
修正后的完整代码
import pygame class Button(): def __init__(self, pos, value, img, screen): self.pos = pos self.value = value self.img = img self.screen = screen ### Getters and Setters ###=============== ### Get/Set Value : True/False ### def setValue(self, value): self.value = value def getValue(self): return self.value ### Get/Set Pos ### def setPos(self, pos): self.pos = pos def getPos(self): return self.pos ### Get/Set Img ### def setImg(self, img): self.img = img def getImg(self): return self.img #========================================== def isHovering(self): pos = self.getPos() # 这里要加self.调用实例方法 # pygame.Rect的首字母要大写,参数格式为(x, y, width, height) imgRect = pygame.Rect(pos[0], pos[1], 105, 105) if imgRect.collidepoint(pygame.mouse.get_pos()): return True else: return False def update(self, screen): if self.isHovering(): # 这里要加self.调用实例方法 # pygame.transform.scale的第二个参数是尺寸元组,不能直接调用图像对象 image = pygame.transform.scale(self.img, (95, 95)) else: image = pygame.transform.scale(self.img, (105, 105)) screen.blit(image, self.pos)
关键修改点说明
- 调用实例方法必须加
self.:- 在
isHovering方法里,getPos()需要改为self.getPos()——因为getPos是Button类的实例方法,只有通过self才能访问当前实例的这个方法。 - 在
update方法里,isHovering()需要改为self.isHovering(),同理,必须用self来调用当前按钮实例的isHovering方法。
- 在
- 修复
pygame.transform.scale的语法错误:
你原来写的self.img(95, 95)是把图像对象当成函数调用了,正确用法是pygame.transform.scale(图像对象, (宽度, 高度)),所以改成self.img, (95, 95)。 - 修正Pygame矩形类的写法:
Pygame中的矩形类是大写开头的Rect,小写的rect会触发报错,这个细节也需要修正。
这样修改后,在主循环里创建Button实例并调用update(screen),就能正常触发isHovering的判断,实现鼠标悬停时缩放按钮的效果了。
内容的提问来源于stack exchange,提问作者Astrocow
相关产品推荐
相关产品推荐

