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

Python新手求助:如何通过单次布局向ListBox添加多个元素?

解决PySimpleGUI ListBox仅显示最后一个元素的问题

你的问题出在ListBox的初始化参数上——你只传入了循环最后一次的currentPlayer.name,自然只会显示最后一个玩家。要让所有玩家都显示出来,得把所有玩家的名字整合成一个列表传给ListBox。

修改步骤:

  1. 收集所有玩家名字
    循环结束后,用列表推导式把AllPlayers里每个玩家的名字提取出来:
player_names = [player.name for player in AllPlayers]
  1. 更新ListBox的数据源
    把布局里ListBox的第一个参数从[currentPlayer.name]换成上面的player_names:
Readlayout = [
    [sg.Text('Chose from list')],
    [sg.Text('Name,Endurance,Stamina,Physical')],
    [sg.Listbox(player_names, size=(40,20), key='Players')],
    [sg.Button('Ok')],
]

修改后的完整代码示例:

class Player:
    def __init__(self,name,end,stam,phys):
        self.name = name
        self.end = end
        self.stam = stam
        self.phys = phys

def make_player(name,end,stam,phys):
    player = Player(name,end,stam,phys)
    return player

# 从单元格获取数据
AllPlayers = []

for i in range(1, sheet1.nrows):
    name = sheet1.cell_value(i, 0)
    end = sheet1.cell_value(i, 1)
    stam = sheet1.cell_value(i, 2)
    phys = sheet1.cell_value(i, 3)
    currentPlayer = make_player(name,end,stam,phys)
    AllPlayers.append(currentPlayer)
    print(currentPlayer.end)

# 生成所有玩家名字列表
player_names = [player.name for player in AllPlayers]

# 布局代码
Readlayout = [
    [sg.Text('Chose from list')],
    [sg.Text('Name,Endurance,Stamina,Physical')],
    [sg.Listbox(player_names, size=(40,20), key='Players')],
    [sg.Button('Ok')],
]

为什么之前的代码不行?

循环里每次给currentPlayer赋值,循环结束后它只保存了最后一个玩家的引用。你把[currentPlayer.name]传给ListBox,本质上是传了一个只有单个元素的列表,所以自然只能看到最后一个玩家。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:15:35