如何为PySimpleGuiQt的Combo组件设置文本与对应值(类HTML选项)
PySimpleGuiQt Combo 实现显示文本与对应值分离方案
PySimpleGuiQt 的 Combo 组件本身没有直接提供「显示文本-对应值」分离的参数配置,你之前的写法报错是因为 Combo 构造函数的第一个位置参数就是选项列表(对应参数名values),显式传递values=someListOfObjects会导致重复赋值。以下是两种可行的解决方法:
方法1:通过索引映射(兼容重名场景)
初始化 Combo 时传入显示名称列表,选中后通过名称在列表中的索引,匹配对应值列表里的对象:
import PySimpleGUIQt as sg # 显示文本列表与对应值列表 someListOfNames = ["苹果", "香蕉", "橙子"] someListOfObjects = ["APPLE_OBJ", "BANANA_OBJ", "ORANGE_OBJ"] # 可替换为任意对象类型 layout = [ [sg.Combo(someListOfNames, key="-COMBO-")], [sg.Button("获取对象"), sg.Button("退出")] ] window = sg.Window("Combo 示例", layout) while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, "退出"): break if event == "获取对象": selected_name = values["-COMBO-"] if selected_name: # 通过名称找索引,匹配对应对象 idx = someListOfNames.index(selected_name) selected_obj = someListOfObjects[idx] print(f"选中的对象:{selected_obj}") window.close()
注意:如果显示列表存在重名,index()只会返回第一个匹配项的索引,此时建议用方法2。
方法2:自定义对象重写__str__(更优雅的方案)
创建包含显示文本和对应对象的自定义类,重写__str__方法让 Combo 显示指定文本,选中后直接获取绑定的对象:
import PySimpleGuiQt as sg class ComboItem: def __init__(self, display_name, target_obj): self.display_name = display_name self.target_obj = target_obj def __str__(self): # Combo 组件会显示该方法的返回值 return self.display_name # 构造 Combo 选项列表 combo_options = [ ComboItem("苹果", "APPLE_OBJ"), ComboItem("香蕉", "BANANA_OBJ"), ComboItem("橙子", "ORANGE_OBJ") ] layout = [ [sg.Combo(combo_options, key="-COMBO-")], [sg.Button("获取对象"), sg.Button("退出")] ] window = sg.Window("Combo 示例", layout) while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, "退出"): break if event == "获取对象": selected_item = values["-COMBO-"] if selected_item: # 直接获取绑定的目标对象 print(f"选中的对象:{selected_item.target_obj}") window.close()
内容的提问来源于stack exchange,提问作者SkySibe
相关产品推荐
相关产品推荐

