如何在调整Pygame窗口大小后保留旧屏幕内容?
解决Pygame可调整窗口大小后内容消失的问题
我明白你遇到的困扰了——调整Pygame窗口大小后,之前绘制的内容直接消失了。咱们来一步步拆解问题,然后给出可行的修复方案:
问题分析
你的代码存在几个关键问题:
- 缺少
sys模块导入:代码里用到了sys.exit(),但没提前导入sys模块,运行时会直接报错 - 仅一次性绘制内容:你只在初始化阶段
blit了一次somesurface,主循环里没有持续重绘的逻辑,窗口任何刷新操作(比如调整大小、最小化还原)都会导致内容丢失 - 错误的窗口resize处理逻辑:在
VIDEORESIZE事件里直接把旧的screen表面复制到新窗口是不可靠的,Pygame创建新的显示表面后,旧表面的内容并不一定能完整保留,而且这种方式也无法应对后续的窗口刷新需求
修复后的代码
import pygame import sys # 先创建一个测试用的somesurface(你可以替换成自己的表面) somesurface = pygame.Surface((200, 200)) somesurface.fill((255, 0, 0)) # 填充红色,方便观察效果 pygame.init() screen = pygame.display.set_mode((640, 360), pygame.RESIZABLE) clock = pygame.time.Clock() while True: clock.tick(100) # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.VIDEORESIZE: # 仅更新窗口大小即可 screen = pygame.display.set_mode(event.size, pygame.RESIZABLE) # 核心:每次循环都重新绘制所有内容 screen.fill((0, 0, 0)) # 先填充背景,避免残留旧内容 screen.blit(somesurface, (0, 0)) # 重新绘制你的目标表面 # 更新显示 pygame.display.flip()
关键修复点说明
- 补充
sys模块导入:解决sys.exit()的报错问题 - 主循环内持续重绘:把所有绘制逻辑(填充背景、blit表面)放到主循环里,这样每次窗口刷新都会重新绘制内容,无论窗口是否调整大小
- 简化resize逻辑:resize时只需要更新
screen的大小即可,不需要复制旧表面,后续的主循环会自动重新绘制所有内容
额外优化建议
如果你想让你的表面在窗口resize时也跟着自适应调整大小,可以在VIDEORESIZE事件里添加缩放逻辑:
if event.type == pygame.VIDEORESIZE: screen = pygame.display.set_mode(event.size, pygame.RESIZABLE) # 按窗口比例等比例缩放somesurface scale_factor = min(event.size[0]/somesurface.get_width(), event.size[1]/somesurface.get_height()) somesurface = pygame.transform.scale(somesurface, (int(somesurface.get_width()*scale_factor), int(somesurface.get_height()*scale_factor)))
这样你的表面会跟着窗口大小自动适配,体验会更好~
内容的提问来源于stack exchange,提问作者YEp d
相关产品推荐
相关产品推荐

