Python新手求助:如何通过单次布局向ListBox添加多个元素?
解决PySimpleGUI ListBox仅显示最后一个元素的问题
你的问题出在ListBox的初始化参数上——你只传入了循环最后一次的currentPlayer.name,自然只会显示最后一个玩家。要让所有玩家都显示出来,得把所有玩家的名字整合成一个列表传给ListBox。
修改步骤:
- 收集所有玩家名字
循环结束后,用列表推导式把AllPlayers里每个玩家的名字提取出来:
player_names = [player.name for player in AllPlayers]
- 更新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
相关产品推荐
相关产品推荐

