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

为什么我的pygame代码运行报'builtin_function_or_method'不可下标TypeError?

错误根源

你遇到的'builtin_function_or_method' object is not subscriptable报错,直接原因是将pygame.key.get_pressed方法当成数组用方括号[]索引了,该方法需要先加圆括号调用,返回按键状态数组后才能读取对应按键的状态。

需要修正的所有问题

  • 语法错误:pygame.key.get_pressed是可调用方法,必须写成pygame.key.get_pressed()才能获得按键状态序列,再用[]读取对应按键的状态
  • 代码位置错误:按键检测逻辑必须放在游戏主循环(main函数内的while True代码块)中,才能每帧检测按键状态;放在main函数外的代码只会在程序启动时执行一次,且执行时pygame还未完成初始化
  • 操作对象错误:你修改的是Player类本身的属性,应该修改你实例化出来的player对象的坐标;且Player类没有自定义y属性,角色坐标存储在player.rect.y中
  • 逻辑缺失:主循环中没有添加退出事件检测,窗口会触发无响应报错;pygame.QUIT是事件常量不是函数,不需要加括号调用
  • 冗余代码:全局作用域下创建的screen = pygame.display.set_mode ((600, 400))没有实际作用,main函数中会重新创建窗口,可以直接删除
  • 逻辑错误:原有移动逻辑的坐标修改方向写反了,W对应向上移动应该减少y坐标,S对应向下移动应该增加y坐标

修正后完整代码

import pygame

WIDTH = 800
HEIGHT = 600
BACKGROUND = (0, 0, 0)

class Player:
    def __init__(self):
        self.image = pygame.image.load("Player.png")
        self.rect = self.image.get_rect()

def main():
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    clock = pygame.time.Clock()
    player = Player()

    while True:
        # 退出事件检测
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
        
        # 按键检测与移动逻辑
        key_state = pygame.key.get_pressed()
        if key_state[pygame.K_w]:
            player.rect.y -= 5
        if key_state[pygame.K_s]:
            player.rect.y += 5

        # 画面渲染
        screen.fill(BACKGROUND)
        screen.blit(player.image, player.rect)
        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Chainz Games

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:02