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

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)
解决方案

问题根源

  1. PySimpleGUI的Listbox默认支持多选,所以values['-PART-']返回的是选中项的列表,而非单个值。
  2. 原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:41:59