Можно ли обновить PySimpleGUI InputOptionMenu?

#python #pysimplegui

#python #pysimplegui

Вопрос:

Я хочу обновить значения в меню параметров ввода PySimpleGUI. Следующее изначально присваивает содержимое списка «имена» Listbox. Это перезаписывается при назначении списка ‘new_values’. Итак, нет проблем с обновлением Listbox, но элемент InputOptionMenu не обновляется.

 import PySimpleGUI as sg

names = ['Roberta', 'Kylie']

layout = [[sg.Listbox(names, size=(20, 4), key='_LIST_')],
          [sg.InputOptionMenu(names, size=(20, 4), key='_LIST_')]]

window = sg.Window('').Layout(layout).Finalize()

new_values = ['Bill', 'Jeff']
window.Element('_LIST_').Update(new_values)

while True:
    event, values = window.Read()
    if event is None or event == 'Exit':
        break

window.Close()
  

Я ожидаю, что оба элемента будут обновлены до Bill и Jeff. Listbox есть, но в InputOptionMenu отображаются Роберта и Кайли.

Ответ №1:

Вы действительно можете обновить до новых значений. У вас не в порядке параметр в вызове обновления. Первый параметр, value устанавливает отображаемое в данный момент значение. Второй параметр, values тот, который вам нужен.

Исправление заключается в добавлении имени параметра к вашему вызову:

 window.Element('_LIST_').Update(values=new_values)
  

Кроме того, вы не должны называть 2 ключа одинаково. Они должны быть уникальными среди макета. Я бы вызвал другой _OPTIONS_ или что-то в этом роде.

В коде обновления для меню опций была обнаружена ошибка, которая теперь исправлена и зарегистрирована на GitHub. Исправление было загружено в PyPI в версии 3.27.

Вот ваш код, переработанный и протестированный с использованием последнего кода PySimpleGUI. Я включил дополнительный параметр в OptionMenu.Вызов Update, чтобы показать вам, как явно задать

 import PySimpleGUI as sg

names = ['Roberta', 'Kylie']

layout = [[sg.Listbox(names, size=(20, 4), key='_LIST_')],
          [sg.OptionMenu(names, size=(20, 4), key='_OPT_')]]

window = sg.Window('').Layout(layout).Finalize()

new_values = ['Bill', 'Jeff']
window.Element('_LIST_').Update(values=new_values)
window.Element('_OPT_').Update(values=new_values, value='Jeff')

while True:
    event, values = window.Read()
    if event is None or event == 'Exit':
        break

window.Close()
  

Комментарии:

1. Это работает, если вы получаете последний код с GitHub, как описано в ответе.

2. При запуске с последней версией user-images.githubusercontent.com/13696193 /…

3. Все еще не понимаю понижения голосов, когда OP указывает, что код работает. Действительно пытался решить и эту проблему.

4. Я поддержал ваш ответ, чтобы избавиться от отрицательной оценки. =)