Как я могу создать переключатели из списка, используя PySimpleGui?

Я хочу использовать PySimpleGui для динамического создания переключателей из списка, но мои попытки вставить цикл в код компоновки ловят синтаксические ошибки. Можно ли это сделать с помощью API или мне нужно сделать это с помощью tkinter? Мой список создается целевым поиском файлов на сетевом диске.

Я попытался объединить "макет", поместив секцию переключателей в цикл for. Также попытался вставить цикл for в само объявление [sg.Radio()]. Ни то, ни другое не работает.

import PySimpleGUI as sg

xList = ['a', 'b', ... 'zz']

layout = [[sg.Text('Select a thingy')],
          [sg.Radio(<for thingy in xList: 'thingy', thingy>)],
                   #^^^^^^ for loop is psuedo code
          [sg.OK(), sg.Cancel()]]

1 ответ

Я думаю, это то, что вы ищете?

import PySimpleGUI as sg

radio_choices = ['a', 'b', 'c']
layout = [
            [sg.Text('My layout')],
            [sg.Radio(text, 1) for text in radio_choices],
            [sg.Button('Read')]
         ]

window = sg.Window('Radio Button Example', layout)

while True:             # Event Loop
    event, values = window.Read()
    if event is None:
        break
    print(event, values)

Это производит это окно:

Есть несколько способов "построить" layout переменная. Вот несколько других комбинаций, которые производят то же самое окно:

Этот первый строит по одной строке за раз, а затем добавляет их вместе в конце

# Build Layout
top_part = [[sg.Text('My layout')]]
radio_buttons = [[sg.Radio(x,1) for x in radio_choices]]
read = [[sg.Button('Read')]]
layout = top_part + radio_buttons + read

Он также строит по одной строке за раз, а затем складывает их вместе, но делает это в одном выражении вместо 4.

   # Build layout
    layout = [[sg.Text('My layout')]] + \
                [[sg.Radio(text, 1) for text in radio_choices]] + \
                [[sg.Button('Read')]]

Если вы хотите добавить эти кнопки по одной на строку, то есть несколько способов сделать это тоже. Если вы используете Python 3.6, это будет работать:

layout = [
            [sg.Text('My layout')],
            *[[sg.Radio(text, 1),] for text in radio_choices],
            [sg.Button('Read')]
         ]

Техника "Построить макет" будет работать в системах, где приведенный выше оператор * недопустим.

radio_choices = ['a', 'b', 'c']
radio = [[sg.Radio(text, 1),] for text in radio_choices]
layout = [[sg.Text('My layout')]] + radio + [[sg.OK()]]

Обе эти вариации в сочетании с кодом окна и циклом обработки событий создадут окно, которое выглядит следующим образом:

Другие вопросы по тегам