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

如何在调整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()

关键修复点说明

  1. 补充sys模块导入:解决sys.exit()的报错问题
  2. 主循环内持续重绘:把所有绘制逻辑(填充背景、blit表面)放到主循环里,这样每次窗口刷新都会重新绘制内容,无论窗口是否调整大小
  3. 简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:57:31