如何在PySimpleGUI中利用window.size动态调整元素尺寸
解决PySimpleGUI窗口resize时动态调整元素大小的问题
你的代码无法实时响应窗口尺寸变化的核心问题有两个:
- 代码顺序错误:先获取窗口尺寸再调用
window.read(),导致获取的是上一次循环的旧尺寸,而非当前最新的窗口大小。 - 未监听窗口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
相关产品推荐
相关产品推荐

