使用循环生成帧: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()
我想用循环生成输入表单,但是改写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()