Pygame中WindowResized、WindowSizeChanged与VIDEORESIZE事件差异及选型
Pygame窗口缩放事件选择:VIDEORESIZE vs WINDOWRESIZED vs WINDOWSIZECHANGED
事件文档信息
根据Pygame官方文档:
VIDEORESIZE(遗留事件)描述:用户调整窗口尺寸时触发。
属性:size、w、h,提供新尺寸。
官方明确标注为“遗留”,推荐使用新的WINDOWEVENT体系。WINDOWRESIZED描述:窗口已调整大小。
属性:x、y、window,其中x/y对应新窗口的宽/高。WINDOWSIZECHANGED描述:窗口尺寸已更改。
属性:x、y、window,x/y对应新窗口的宽/高。
测试情况
为验证事件触发逻辑,编写了最小测试代码:
import pygame pygame.init() window = pygame.display.set_mode((1200, 900), pygame.RESIZABLE) pygame.display.set_caption("Minimal Example") clock = pygame.time.Clock() running = True while running: clock.tick(2) # 降低帧率避免事件过多 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False print(event) # 输出触发的事件 pygame.display.update() pygame.quit()
测试输出示例:
<Event(32778-WindowResized {'x': 994, 'y': 661, 'window': None})> <Event(32779-WindowSizeChanged {'x': 994, 'y': 661, 'window': None})> <Event(32769-VideoResize {'size': (994, 661), 'w': 994, 'h': 661})> <Event(32778-WindowResized {'x': 994, 'y': 661, 'window': None})>
测试发现:
- 三个事件提供的宽高值完全一致,
window属性在单窗口场景下无实际值。 - 鼠标拖动调整窗口时,
WINDOWRESIZED会多次触发;键盘分屏调整时,所有事件都会触发,且WINDOWRESIZED仅触发一次。
核心差异与使用建议
事件本质区别
VIDEORESIZE:旧版事件体系的产物,仅响应用户手动调整窗口的动作,虽然属性直接易用,但官方已标记为遗留,后续版本存在兼容性风险,不推荐长期使用。WINDOWRESIZED:新版窗口事件,主要触发场景是用户主动完成窗口调整动作(比如松开鼠标、完成分屏),但拖动过程中系统的中间状态也会触发该事件,导致多次触发。WINDOWSIZECHANGED:更底层的事件,任何导致窗口尺寸变化的场景都会触发——包括用户手动调整、代码动态修改窗口大小、系统自动调整(如主题变更导致边框尺寸变化)等。
实际选择建议
- 若仅需响应用户手动调整窗口的需求,优先选
WINDOWRESIZED,符合官方推荐的新事件体系,未来兼容性更好。针对多次触发的问题,可以通过记录上一次窗口尺寸,对比后再执行缩放逻辑来避免重复操作:last_size = window.get_size() # 在事件循环内 if event.type == pygame.WINDOWRESIZED: new_size = (event.x, event.y) if new_size != last_size: last_size = new_size # 执行精灵缩放逻辑 - 若需要监听所有可能改变窗口尺寸的场景(比如代码动态调整窗口),则选择
WINDOWSIZECHANGED。 - 尽量避免使用
VIDEORESIZE,尽管现有教程仍在使用,但官方已明确不推荐,后续版本可能被移除或修改行为。
内容的提问来源于stack exchange,提问作者WeCanDoItGuys
相关产品推荐
相关产品推荐

