Можно ли обновить PySimpleGUI InputOptionMenu?
Я хочу обновить значения меню параметров ввода PySimpleGUI. Следующее изначально присваивает содержимое списка "имен" списку. Это перезаписывается, когда назначается список 'new_values'. Таким образом, нет проблем с обновлением Listbox, но элемент Input Option Menu не обновляется.
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()
Я ожидаю, что оба элемента будут обновлены до Билла и Джеффа. Список есть, но Input Option Menu показывает Роберту и Кайли.
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()