【问题标题】:Generate Frame Using Loop : PySimpleGUI使用循环生成帧:PySimpleGUI
【发布时间】:2021-04-24 10:43:18
【问题描述】:

我想用循环来生成输入表单,但是将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()

【问题讨论】:

    标签: pysimplegui


    【解决方案1】:

    在下面的代码中,v 将是字典 form_items 的键,所以 val 将是每个字符,就像 ['n', 'a', 'm', 'e'] 中的项目,如果 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()
    

    【讨论】:

    • 谢谢!我从你的代码中学到了很多东西。
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 2020-12-06
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2019-05-08
    相关资源
    最近更新 更多