Python新手开发Pygame圆形分组移动功能时列表存储报错求助
核心错误点
- 变量
intGroup定义前存在冗余空格,直接触发语法报错 - 初始将
circles定义为列表,循环中反复将其覆盖为字典,无法存储所有圆形数据 - 将
pygame.draw.circle返回的Rect对象装入列表后调用get_rect()方法,列表无该属性,触发属性错误 - 绘制、移动逻辑都写在主事件循环之外,仅会执行一次,无法实现持续移动、实时刷新的效果
- 遍历
circles的逻辑错误,字典遍历方式与预期的列表遍历逻辑不匹配
修复后可运行代码
你需要的分组控制移动功能可以直接用Pygame自带的精灵组实现,逻辑更清晰,以下是完整可运行代码:
import pygame import math import sys # 初始化Pygame pygame.init() # 配置参数 WHITE = (255, 255, 255) BLUE = (0, 0, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) ORANGE = (255, 127, 0) YELLOW = (255, 255, 0) PURPLE = (160, 32, 240) listCircleColor = (RED, BLUE, GREEN, ORANGE, YELLOW, PURPLE, WHITE) intGroup = 5 turnangle = 360/35 width = 600 height = 600 radius = 100 screen = pygame.display.set_mode((width, height)) clock = pygame.time.Clock() running = True # 自定义圆形精灵类 class CircleSprite(pygame.sprite.Sprite): def __init__(self, color, pos, radius): super().__init__() # 生成透明背景的圆形Surface self.image = pygame.Surface((radius*2, radius*2), pygame.SRCALPHA) pygame.draw.circle(self.image, color, (radius, radius), radius, width=2) self.rect = self.image.get_rect(center=pos) # 移动逻辑,每帧右移1像素 def update(self): self.rect.right += 1 # 创建精灵组 circle_group = pygame.sprite.Group() # 生成所有圆形并加入精灵组 alpha = turnangle for i in range(intGroup): for cl in listCircleColor: # 无需分象限计算,cos/sin原生支持全角度正负计算 x = 300 + radius * math.cos(math.radians(alpha)) y = 300 + radius * math.sin(math.radians(alpha)) # 创建精灵并加入组 circle = CircleSprite(cl, (x, y), radius) circle_group.add(circle) alpha += turnangle # 主循环 while running: # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 刷新背景 screen.fill((0,0,0)) # 批量更新所有圆形(执行移动逻辑) circle_group.update() # 批量绘制所有圆形 circle_group.draw(screen) # 刷新屏幕 pygame.display.flip() # 控制帧率40 clock.tick(40)
补充说明
- 所有圆形都存在
circle_group精灵组中,可直接对组内所有元素统一执行更新、绘制操作,符合你要分组控制的需求 - 移除了冗余的四象限坐标计算逻辑,三角函数原生支持全角度的正负值计算
- 所有逻辑都放到主循环内执行,保证每帧都能刷新画面和移动位置
内容的提问来源于stack exchange,提问作者Ven
相关产品推荐
相关产品推荐

