PySimpleGUI中单选按钮更新字典后如何返回列表选中值
问题描述
创建了一个包含两个键的字典,选择单选按钮时会更新列表内容,但无法获取列表中选中的值。例如选择'male'后再选择'Executed',希望能得到'Executed'这个值。当前退出程序时返回结果为:Exit {'-IN1-': True, '-IN2-': False, '-PART-': []}
原代码
import PySimpleGUI as sg genero = { 'male': ['Required','Executed'], 'female': ['Required', 'Performed'] } layout = [ [sg.Radio('male', "RADIO1", default=False, key="-IN1-")], [sg.Radio('female', "RADIO1", default=False, key="-IN2-")], [sg.Listbox(genero.keys(), size=(30, 3), enable_events=True, key='-PART-')], [sg.Push(),sg.Button('GENERATE'), sg.Exit("Exit")] ] window = sg.Window("GENERATE PETITION", layout) while True: event, values = window.read() if event == sg.WIN_CLOSED or event == "Exit": break elif values["-IN1-"] == True: window['-PART-'].update(genero['male']) elif values["-IN2-"] == True: window['-PART-'].update(genero['female']) elif event == 'GENERATE': print('-PART-') window.close() print(event,values)
解决方案
问题根源
- PySimpleGUI的
Listbox默认支持多选,所以values['-PART-']返回的是选中项的列表,而非单个值。 - 原代码中
print('-PART-')只是打印了字符串,没有输出实际选中的列表值。
修改要点
- 可选:给
Listbox添加select_mode=sg.LISTBOX_SELECT_MODE_SINGLE参数,强制单选模式,更贴合需求场景。 - 在
GENERATE事件中,访问values['-PART-']获取选中值列表,若为单选可直接取第一个元素(注意判断列表是否为空,避免索引错误)。
修改后的完整代码
import PySimpleGUI as sg genero = { 'male': ['Required','Executed'], 'female': ['Required', 'Performed'] } layout = [ [sg.Radio('male', "RADIO1", default=False, key="-IN1-")], [sg.Radio('female', "RADIO1", default=False, key="-IN2-")], # 添加select_mode参数强制单选 [sg.Listbox(genero.keys(), size=(30, 3), enable_events=True, key='-PART-', select_mode=sg.LISTBOX_SELECT_MODE_SINGLE)], [sg.Push(),sg.Button('GENERATE'), sg.Exit("Exit")] ] window = sg.Window("GENERATE PETITION", layout) while True: event, values = window.read() if event == sg.WIN_CLOSED or event == "Exit": break elif values["-IN1-"] == True: window['-PART-'].update(genero['male']) elif values["-IN2-"] == True: window['-PART-'].update(genero['female']) elif event == 'GENERATE': # 获取选中值列表 selected_items = values['-PART-'] if selected_items: # 单选模式下取第一个元素 print(f"选中的值:{selected_items[0]}") else: print("未选中任何项") window.close() print(event,values)
效果说明
选择male后,列表更新为['Required','Executed'],选中Executed点击GENERATE,控制台会输出选中的值:Executed;退出程序时,values['-PART-']也会正确记录选中的项(单选下是包含单个元素的列表)。
内容的提问来源于stack exchange,提问作者aprendiz1001
相关产品推荐
相关产品推荐

