Как я могу создать переключатели из списка с помощью 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()]]

person OldFartN00B    schedule 22.05.2019    source источник
comment
какую синтаксическую ошибку вы получаете?   -  person Danielle    schedule 22.05.2019


Ответы (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()]]

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

person Mike from PSG    schedule 22.05.2019
comment
Спасибо за быстрый ответ и за множество точных примеров. Есть ли способ разместить каждую радиокнопку в отдельной строке? Я попытался включить \ n как часть каждого элемента в моем списке, и это привело только к небольшому смещению текста от RB. Если список короткий, подойдет одна строка. - person OldFartN00B; 22.05.2019
comment
Хорошо, я отредактировал ответ, чтобы включить методы создания переключателей в отдельных строках. Не было ли хорошей документации или примеров программ, показывающих, как делать что-то подобное? Где бы вы смотрели в документации или в примерах программ? Например, как называется демонстрационная программа для чего-то вроде этого? Программно построенные макеты ' - person Mike from PSG; 23.05.2019
comment
В документацию добавлен значительный раздел, посвященный созданию макетов с использованием кода. Этот вопрос был отличным, поскольку он побудил довольно много исследований и, в конечном итоге, документирования ряда питонических способов создания окон. Приятно использовать составление списков для создания целых окон. Readme и ReadTheDocs были обновлены. - person Mike from PSG; 04.09.2019
comment
Хотя OP не спрашивал ... решение не назначает ключ группе. Это означает, что он не может обновляться динамически. Или мне что-то не хватает @ Mike-from-PSG? - person Jay Marm; 12.05.2021