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

Python类内无法调用自身方法问题求助(Pygame按钮类场景)

解决Pygame Button类中方法调用的NameError问题

刚接触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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:04:16