在 PySimpleGUI 中:如何根据用户在另一个 Drop 对象中的选择来设置 Drop 对象的值?

In PySimpleGUI: How to set the values of a Drop object based on the user's selection in another Drop object?

例如,我有两个 Drop 对象下拉列表。第一个用户可以从 OPTIONS_CHOICE 中选择,第二个基于用户在 OPTION_CHOICE 中的选择。 IE。如果第一个下拉列表中的用户 select 'Geometric Asian',则只有 ['Closed Form'、'Monte Carlo'] 可供选择。

import sys
import PySimpleGUI as sg

OPTIONS_CHOICE = ['European', 'American', 'Geometric Asian', 'Arithmetic Asian', 'Geometric Basket', 'Arithmetic Basket']

methodology = {
    'European' : ['Black Scholes', 'Binominal Tree'],
    'American' : ['Binominal Tree'],
    'Geometric Asian' : ['Closed Form', 'Monte Carlo'],
    'Arithmetic Asian' : ['Monte Carlo', 'Monte Carlo with Control Variate'],
    'Geometric Basket' : ['Closed Form', 'Monte Carlo'],
    'Arithmetic Basket' : ['Monte Carlo', 'Monte Carlo with Control Variate'],
}

option_layout = [
    [sg.Text('Step 1: Select an Option Type', background_color='darkseagreen')],
    [sg.Text('Option Type:', background_color='darkseagreen'), sg.Drop(values=OPTIONS_CHOICE, default_value = 'European', auto_size_text=True, enable_events=True, key='option_type')],
    [sg.Text('Step 2: Select a Methodology', background_color='darkseagreen')],
    [sg.Text('Methodology:', background_color='darkseagreen'), sg.Drop(values=option_choice, auto_size_text=True)]
    ]

iv_layout = [[sg.Text('This is inside tab 5')],
            [sg.Input(key='-in4-')]]


layout = [[sg.TabGroup([[sg.Tab('Option Value', option_layout, background_color='darkseagreen', key='-mykey-'),
                        sg.Tab('Implied Volatility', iv_layout)]], key='-group1-', tab_location='top', selected_title_color='purple')],
        [sg.Button('Compute')]]

window = sg.Window('Option Calculator', layout,
                default_element_size=(12, 1))

while True:
    event, values = window.read()
    sg.popup_non_blocking(event, values)
    print(event, values)
    if event == sg.WIN_CLOSED:           # always,  always give a way out!
        break

    print(event, values)


window.close()

在事件循环中发生第一个 Drop 事件时更新第二个 Drop 元素。

import sys
import PySimpleGUI as sg

OPTIONS_CHOICE = ['European', 'American', 'Geometric Asian', 'Arithmetic Asian', 'Geometric Basket', 'Arithmetic Basket']

methodology = {
    'European' : ['Black Scholes', 'Binominal Tree'],
    'American' : ['Binominal Tree'],
    'Geometric Asian' : ['Closed Form', 'Monte Carlo'],
    'Arithmetic Asian' : ['Monte Carlo', 'Monte Carlo with Control Variate'],
    'Geometric Basket' : ['Closed Form', 'Monte Carlo'],
    'Arithmetic Basket' : ['Monte Carlo', 'Monte Carlo with Control Variate'],
}

default1 = OPTIONS_CHOICE[0]
option_choice = methodology[default1]
default2 = option_choice[0]

option_layout = [
    [sg.Text('Step 1: Select an Option Type', background_color='darkseagreen')],
    [sg.Text('Option Type:', background_color='darkseagreen'),
     sg.Drop(values=OPTIONS_CHOICE, default_value = default1, auto_size_text=True, enable_events=True, key='option_type')],
    [sg.Text('Step 2: Select a Methodology', background_color='darkseagreen')],
    [sg.Text('Methodology:', background_color='darkseagreen'),
     sg.Drop(values=option_choice, default_value = default2, auto_size_text=True, key='option_value')]
    ]

iv_layout = [[sg.Text('This is inside tab 5')],
            [sg.Input(key='-in4-')]]


layout = [[sg.TabGroup([[sg.Tab('Option Value', option_layout, background_color='darkseagreen', key='-mykey-'),
                        sg.Tab('Implied Volatility', iv_layout)]], key='-group1-', tab_location='top', selected_title_color='purple')],
        [sg.Button('Compute')]]

window = sg.Window('Option Calculator', layout,
                default_element_size=(12, 1))

while True:

    event, values = window.read()

    print(event, values)
    if event == sg.WIN_CLOSED:           # always,  always give a way out!
        break
    elif event == 'option_type':
        select = values[event]
        option_choice = methodology[select]
        window['option_value'].update(value=option_choice[0], values=option_choice)
    sg.popup_non_blocking(event, values)

window.close()