Pygame修改Rect颜色后窗口未触发重绘更新问题求助
问题根本原因
- 你修改的只是Sq实例的
color属性值,并没有重新调用pygame.draw.rect绘制对应方块,pygame.display.update()只是把缓存的绘制内容同步到屏幕,不会自动根据属性值重绘元素。 - Sq类的
__init__方法里只在实例化时执行了一次绘制操作,后续属性变更不会触发自动重绘。 - 绘制逻辑顺序错误,不应该把Sq实例的创建、颜色修改逻辑混在绘制方法里,且没有按照Pygame标准的逐帧刷新逻辑执行。
修正方案
给Sq类增加单独的draw方法,每次需要渲染时主动调用,按照「事件处理→逻辑更新→逐帧重绘→统一刷新屏幕」的标准Pygame逻辑改造代码即可,改造后参考代码如下:
import pygame class Sq(): def __init__(self, surface, color, x, y, width=50, height=50): self.tag = 'normal' self.value = 1 self.color = color self.x = x self.y = y self.width = width self.height = height self.surface = surface # 新增独立绘制方法,每次刷新主动调用 def draw(self): pygame.draw.rect(self.surface, self.color, (self.x, self.y, self.width, self.height)) # 初始化阶段一次性创建所有方块实例 def init_grid(surface): SqL = [] # 可通过循环批量创建,无需手动声明a1~aN for x_offset in range(0, 816, 51): SqL.append(Sq(surface, (255,0,0), x_offset, 3, 50, 50)) # 其他行方块同理添加到列表即可 return SqL # 主运行逻辑 pygame.init() screen = pygame.display.set_mode((800, 600)) SqL = init_grid(screen) running = True while running: # 1. 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 2. 更新逻辑:修改符合条件的方块颜色 for sq in SqL: if sq.tag == 'normal': sq.color = (0,0,255) # 3. 逐帧渲染:先清屏再绘制所有元素 screen.fill((0,0,0)) # 用背景色清空上一帧内容 for sq in SqL: sq.draw() # 4. 统一更新屏幕 pygame.display.update() pygame.quit()
内容的提问来源于stack exchange,提问作者1stFrame
相关产品推荐
相关产品推荐

