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

PySimpleGUI批量生成列内组件报错,求正确实现方式

问题原因与解决方案

你的报错核心是布局嵌套层级错误:[NameBox(x) for x in range(5)]生成的是一个包含5个行组件列表的列表,但你把这个整体作为了col1中的一行,导致PySimpleGUI解析时遇到三层嵌套结构(col1 → 行 → 行组件列表),而它只接受两层结构(col1 → 行组件列表)。

修正方法

不需要逐个编写组件,只需把循环生成的行列表直接合并到col1中,而非嵌套在另一层列表里:

import PySimpleGUI as sg

def NameBox(num):
    # 可选优化:生成带序数后缀的文本(1st、2nd、3rd...)
    suffix = "th" if 11 <= num <= 13 else {1:"st",2:"nd",3:"rd"}.get(num%10, "th")
    return [sg.Text(f"{num}{suffix} "), sg.Push(), sg.Input(key=f"-{num}place-", size=(30), do_not_clear=False)]

col1 = [
    [sg.Push(), sg.Text('Insert Names Here'), sg.Push()],
] + [NameBox(x) for x in range(1, 6)] + [  # 直接合并循环生成的行,注意从1开始而非0
    [sg.Push(), sg.Button('Calculate'), sg.Push()],
]

# 同理优化col2的分数输入框,避免冗余
col2 = [
    [sg.Text('Points')],
] + [[sg.Input(key=f"-{num}points-", size=(5, 30))] for num in range(1, 6)] + [
    [sg.Button('Save')]
]

col3 = [
    [sg.Push(), sg.Text('Rankings'), sg.Push()],
    # 后续可在此添加Table组件展示数据
    [sg.Push(), sg.Button('Refresh Scores'), sg.Button('Open to Print'), sg.Push()]
]

layout = [
    [
        sg.Column(col1),
        sg.VSeparator(),
        sg.Column(col2),
        sg.VSeparator(),
        sg.Column(col3),
    ]
] 
window = sg.Window("Shooter Rankings", layout)
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED:
        break
window.close()

关键说明

  • 用+运算符将循环生成的行列表直接拼接到col1和col2的主列表中,确保布局为两层嵌套(外层是列的行集合,内层是每行的组件集合)。
  • 循环从1开始,符合名次的实际逻辑(后续拓展到20名时只需修改循环范围为range(1,21))。
  • 序数后缀生成逻辑可让界面显示更专业,不需要的话直接替换为sg.Text(str(num))即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:46:32