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

Pygame矩形无法显示,除非切换窗口后重新切回

Pygame绘制的矩形仅切换窗口后才显示,如何解决?

问题描述

我写了一段Pygame代码,调用pygame.draw.rect绘制矩形,但程序运行后矩形不显示,只有切换窗口再切回来才会出现。代码如下:

import pygame, sys
from pygame.locals import *
pygame.init()
WHITE = (255,255,255)
class setup():
    def set_resolution(x, y):
        global surf
        global screen
        surf = pygame.Surface((x,y))
        screen = pygame.display.set_mode((x,y))
        pygame.display.set_caption("Lewis' Game")
        pygame.draw.rect(screen, WHITE,(200,150,150,50))
    def menu():
        pass
setup.set_resolution(1024,768)
setup.menu()
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

解决方法

这是Pygame入门时非常典型的问题——你没有主动刷新屏幕缓冲区。

Pygame的所有绘制操作(比如draw.rect)都是在后台的离屏缓冲区完成的,这些内容不会自动同步到显示窗口上。只有当你调用刷新函数时,缓冲区的内容才会被推送到屏幕。而你切换窗口再切回时,系统会强制触发窗口重绘,这才让矩形显示出来。

你需要做两个核心调整:

  • 在绘制流程中添加屏幕刷新的调用
  • 把绘制逻辑放到主循环里(这是游戏开发的标准做法,方便后续添加动画、交互等需要持续刷新的内容)

修改后的代码示例:

import pygame, sys
from pygame.locals import *
pygame.init()
WHITE = (255,255,255)

class setup():
    def set_resolution(x, y):
        global screen
        screen = pygame.display.set_mode((x,y))
        pygame.display.set_caption("Lewis' Game")
    def menu():
        pass

setup.set_resolution(1024,768)
setup.menu()

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    
    # 绘制逻辑(放到主循环里,每次刷新都重绘)
    screen.fill((0,0,0))  # 先填充背景,避免残留之前的绘制内容
    pygame.draw.rect(screen, WHITE,(200,150,150,50))
    
    # 刷新屏幕
    pygame.display.update()  # 或者用pygame.display.flip(),单显示器场景下效果一致

关键细节说明

  • pygame.display.update():可指定刷新区域,默认刷新整个屏幕,效率更高
  • pygame.display.flip():强制刷新整个屏幕,更适合多显示器场景
  • 每次循环先填充背景是为了避免旧绘制内容残留,比如后续移动矩形时,旧位置的矩形不会留在屏幕上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:33:42