Как я могу создать переключатели из списка, используя PySimpleGui? - PullRequest
1 голос
/ 22 мая 2019

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

Я попытался объединить 'layout', поместив секцию переключателей в цикл 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 Ответ

0 голосов
/ 22 мая 2019

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

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)

Создает это окно:

enter image description here

Существует несколько способов «создания» переменной 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()]]

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

...