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

如何在Pygame可调整窗口中绘制固定比例的矩形边框?

问题分析与修正方案

嘿,我来帮你搞定这个Pygame可调整窗口的问题~你的代码思路是对的,但有两个关键细节没处理好,导致效果不符合预期,我们来一步步修正:

核心问题说明

  • 未更新窗口表面引用:在VIDEORESIZE事件中调用pygame.display.set_mode()后,你没有将返回的新窗口表面赋值给win变量。这会导致后续的win.blit()等操作依然在旧的窗口表面上执行,新窗口大小的内容根本不会正确显示出来。
  • 绘制顺序颠倒:你先把空白的surf贴到了窗口上,之后才在surf上绘制红色边框。这时候贴表面的操作已经完成了,边框不会被渲染到窗口上——必须先完成surf上的所有绘制操作,再把它贴到窗口。

修正后的完整代码

import pygame,sys
pygame.init()
# 初始化窗口,保存返回的表面到win变量
win = pygame.display.set_mode((400,400),pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE)
while True:
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.VIDEORESIZE:
            # 关键修改:将新创建的窗口表面重新赋值给win
            win = pygame.display.set_mode((event.w,event.h),pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE)
    # 直接从win获取当前窗口尺寸,更简洁
    win_width,win_height = win.get_size()
    # 创建对应比例的Surface
    surf = pygame.Surface((round(win_width/2),round(win_height/2)))
    surf.fill((255,255,255))
    # 先绘制红色边框,再将surf贴到窗口
    pygame.draw.rect(surf,(255,0,0),(0,0,surf.get_width(),surf.get_height()),10)
    win.blit(surf,(win_width/4,win_height/4))
    pygame.display.update()

额外优化建议

  • 如果你需要频繁调整窗口大小,每次循环都新建Surface会有点浪费性能。可以把surf的创建逻辑移到VIDEORESIZE事件里,只在窗口尺寸变化时更新surf,平时循环只做绘制和贴表面的操作。
  • 在双缓冲模式下,你可以用pygame.display.flip()代替pygame.display.update(),两者效果一致,但flip()会更新整个屏幕,更适合这种全屏渲染的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:07:29