如何在PySimpleGUI元素中按指定比例设置垂直行高?
PySimpleGUI Tab内组件按比例分配纵向高度的实现方案
方案1:纯PySimpleGUI原生配置实现
核心是通过Column容器的rows_weights参数指定行高度权重,配合组件的拉伸参数实现比例分配:
- 两个组件均设置
expand_x=True保证横向占满全部可用宽度 - 两个组件均设置
expand_y=True允许纵向拉伸 - 将两个组件放在同一个
Column容器内,给容器设置rows_weights=[2,1],即第0行(Table)权重2,第1行(Canvas)权重1,自动实现2:1的高度分配 - 注意需要同时给Column容器设置
expand_x=True和expand_y=True,保证容器本身能占满Tab的全部可用空间
示例代码片段:
import PySimpleGUI as sg # Tab内的布局 tab_content = [ [sg.Column( layout=[ [sg.Table(values=[[i for i in range(5)] for _ in range(10)], headings=[f'列{i}' for i in range(5)], expand_x=True, expand_y=True)], # Table允许双向拉伸 [sg.Canvas(background_color='lightgray', expand_x=True, expand_y=True)] # Canvas允许双向拉伸 ], expand_x=True, expand_y=True, # Column占满Tab空间 rows_weights=[2, 1] # 两行高度权重2:1 )] ] layout = [ [sg.TabGroup([[sg.Tab('测试Tab', tab_content)]], expand_x=True, expand_y=True)] ] window = sg.Window('比例分配测试', layout, size=(800, 600), resizable=True) while True: event, values = window.read() if event == sg.WIN_CLOSED: break window.close()
方案2:调用底层Tkinter接口实现(适配原生配置不生效场景)
如果原生配置仍然无法生效,直接操作底层TK组件的网格权重即可:
- 窗口初始化时添加
finalize=True保证组件渲染完成 - 后续通过组件key拿到对应的TK对象,对父容器设置行权重即可
示例代码片段:
import PySimpleGUI as sg import tkinter as tk # 布局里给两个组件指定key方便后续获取 tab_content = [ [sg.Table(values=[[i for i in range(5)] for _ in range(10)], headings=[f'列{i}' for i in range(5)], key='-TABLE-', expand_x=True, expand_y=True)], [sg.Canvas(background_color='lightgray', key='-CANVAS-', expand_x=True, expand_y=True)] ] layout = [ [sg.TabGroup([[sg.Tab('测试Tab', tab_content)]], expand_x=True, expand_y=True)] ] # 初始化时加finalize=True保证组件渲染完成 window = sg.Window('比例分配测试', layout, size=(800, 600), resizable=True, finalize=True) # 获取Canvas组件的父容器(即Tab内部的TK框架) parent_frame = window['-CANVAS-'].TKWidget.master # 设置第0行(Table所在行)权重2,第1行(Canvas所在行)权重1 parent_frame.grid_rowconfigure(0, weight=2) parent_frame.grid_rowconfigure(1, weight=1) while True: event, values = window.read() if event == sg.WIN_CLOSED: break window.close()
内容的提问来源于stack exchange,提问作者cytochrome
相关产品推荐
相关产品推荐

