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
相关产品推荐
相关产品推荐

