使用循环生成帧:PySimpleGUI

Generate Frame Using Loop : PySimpleGUI

我想用循环生成输入表单,但是改写List为Dict后,单选按钮不再是正确的文本属性。请给我一个提示。

[

下面是我使用 Dict 的代码。 (#TODO:在可疑行上)

import PySimpleGUI as sg


form_items = {
    'name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve', 'Frank'],
    'group': ['Google', 'Apple', 'Facebook', 'Amazon'],
    'number': ['100', '200', '300', '400', '500', '600', '700', '800', '900']
    }

radio = []
for i in range(len(form_items)):
    radio.append([])
for i,v in enumerate(form_items):
    for val in v:
        attr = {
            'text': val,
            'group_id': len(val),
            'key': val,
            'enable_events': True,
            'font': 'Helvetica 8'
        }
        radio[i].append([sg.R(**attr)])

cols = []
for i in range(len(form_items)):
    attr = {
        'layout': radio[i],
        'size': (100, 100),
        'scrollable': True,
        'vertical_scroll_only':True
    }
    cols.append([sg.Col(**attr)])

frame = []
for i in range(len(form_items)):
    attr = {
        'layout': [cols[i]],  #TODO:
        'title': list(form_items.keys())[i],
    }
    frame.append([sg.Frame(**attr)])

layout = []
for i in range(len(form_items)):
    layout.append(frame[i])

window = sg.Window('Sandbox', layout)


while True:
    event, values = window.read()
    if event in (None, 'Exit'):
        break
window.close()

在下面的代码中,v 将是字典 form_items 的关键字,因此 val 将是每个字符,如 ['n', 'a', 'm', 'e'] 中的项目 if v'name'.

for i,v in enumerate(form_items):
    for val in v:

还有一个问题,key的顺序不对,radio也不对。

修改源码输出如下,

import ctypes
import PySimpleGUI as sg

ctypes.windll.user32.SetProcessDPIAware()   # Set unit of GUI to pixels

sg.theme('DarkBlue')

form_items = {
    'name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve', 'Frank'],
    'group': ['Google', 'Apple', 'Facebook', 'Amazon'],
    'number': ['100', '200', '300', '400', '500', '600', '700', '800', '900']
    }

radio, cols, frames, layout = [], [], [], [[]]

for key in ['name', 'group', 'number']:

    rows = []
    for item in form_items[key]:
        attr1 = {
            'text': item,
            'group_id': key,
            'enable_events': True,
            'font': 'Helvetica 8',
            'pad': (0, 0),
        }
        rows.append([sg.Radio(**attr1)])

    attr2 = {
        'layout': rows,
        'size': (100, 100),
        'scrollable': True,
        'vertical_scroll_only': True,
        'pad': (0, 0),
    }
    col = [sg.Column(**attr2)]
    cols.append(col)

    attr3 = {
        'layout': [col],
        'title': key.capitalize(),
    }
    frame = sg.Frame(**attr3)
    layout[0].append(frame)

window = sg.Window('Sandbox', layout)

while True:
    event, values = window.read()
    if event in (None, 'Exit'):
        break

window.close()

在我看来,你把它弄得更复杂,下面的代码可能更简单明了。

import ctypes
import PySimpleGUI as sg

def frame(sequence, key):
    radios = [[sg.Radio(text=item, group_id=key, enable_events=True,
        font='Helvetica 8', pad=(0, 0),)] for item in sequence[key]]
    column = [[sg.Column(layout=radios, size=(100, 100), scrollable=True,
        vertical_scroll_only=True, pad=(0, 0))]]
    return sg.Frame(title=key.capitalize(), layout=column)

form_items = {
    'name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve', 'Frank'],
    'group': ['Google', 'Apple', 'Facebook', 'Amazon'],
    'number': ['100', '200', '300', '400', '500', '600', '700', '800', '900']
    }

ctypes.windll.user32.SetProcessDPIAware()   # Set unit of GUI to pixels
sg.theme('DarkBlue')

layout = [[frame(form_items, key) for key in ['name', 'group', 'number']]]
window = sg.Window('Sandbox', layout)

while True:
    event, values = window.read()
    if event in (None, 'Exit'):
        break
window.close()