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

如何在PySimpleGUI中利用window.size动态调整元素尺寸

解决PySimpleGUI窗口resize时动态调整元素大小的问题

你的代码无法实时响应窗口尺寸变化的核心问题有两个:

  1. 代码顺序错误:先获取窗口尺寸再调用window.read(),导致获取的是上一次循环的旧尺寸,而非当前最新的窗口大小。
  2. 未监听窗口resize事件:默认情况下window.read()只会在用户交互(比如点击按钮、关闭窗口)时返回,窗口尺寸变化不会主动触发事件,因此无法实时更新元素。

修正方案

首先确保创建窗口时开启可调整大小(resizable=True),然后通过两种方式实现实时响应:

方式1:定期超时检查(适合需要持续更新的场景)

给window.read()设置一个短超时,让循环定期检查窗口尺寸并更新:

import PySimpleGUI as sg

# 示例布局
layout = [
    [sg.Text('动态标题', key='title')],
    [sg.Button('close game'), sg.Button('close games')]
]

# 创建可调整大小的窗口
window = sg.Window('动态调整字体', layout, resizable=True)

while True:
    # 设置100ms超时,定期触发循环
    event, values = window.read(timeout=100)
    if event == sg.WIN_CLOSED or event in ['close games', 'close game']:
        break
    # 获取当前最新窗口尺寸
    current_height, current_width = window.size
    font_size = int((current_height + current_width)/60)
    window['title'].update(font=('Stay Pixel Regular', font_size))

window.close()

方式2:监听窗口resize事件(更高效,仅在尺寸变化时更新)

PySimpleGUI会在窗口尺寸变化时触发sg.WINDOW_RESIZED事件,监听这个事件即可只在需要时更新:

import PySimpleGUI as sg

layout = [
    [sg.Text('动态标题', key='title')],
    [sg.Button('close game'), sg.Button('close games')]
]

window = sg.Window('动态调整字体', layout, resizable=True)

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event in ['close games', 'close game']:
        break
    # 仅在窗口resize时执行更新
    if event == sg.WINDOW_RESIZED:
        current_height, current_width = window.size
        font_size = int((current_height + current_width)/60)
        window['title'].update(font=('Stay Pixel Regular', font_size))

window.close()

额外注意事项

  • 确保你使用的Stay Pixel Regular字体已安装在系统中,否则会自动 fallback 到默认字体,可能导致视觉上没有变化。
  • 可以在窗口初始化后先执行一次字体更新,让初始状态就匹配窗口尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:52:39