无法在PysimpleGUI中固定函数
我有一个程序,可以通过 + 和 - 按钮在屏幕上添加和移除元素,但问题是这些按钮在显示变化后并没有像我预期的那样自动调整位置,就像我使用固定功能时那样:
1- 初始状态(没问题)
2- 添加一个框架(没问题)
3- 移除一个框架(‘添加另一个需求’和‘移除一个需求’这两个按钮没有移动)
这个布局的代码:
def layout_specification_frame(lvl_1,lvl_2):
layout = [[sg.Frame(title = f'Specification N° {lvl_1}',
layout = [[sg.Text ('Name of the specification'), # Layout for one specification
sg.Input(key = ('-SPECIFICATION TITLE-', lvl_1)),
sg.Text ('Select IFC Version:'),
sg.Combo(ifc_versions, size=(20, 1),default_value='IFC4', key=('-VERSION-',lvl_1))],
[sg.Frame(title = 'Applicability',
layout = [[sg.Text ('All elements of'),
sg.Combo (categories, default_value=None, enable_events=True, key=('-FACET-',lvl_1)),
sg.Text ('That have a')],
[sg.Column(layout_parameter(category,lvl_1),key = f'-FACET PARAMETERS {lvl_1}-')]],
key = f'-APPLICABILITY {lvl_1}-',
relief = 'sunken')],
[sg.Column(layout_requirement_frame(lvl_1,lvl_2),key = f'-SPEC REQUIREMENT {lvl_1}-')],
[sg.pin(sg.Column([[sg.Button('Add another requirement', key = ('-ADD REQ-',lvl_1)),
sg.Button('Remove a requirement',key = ('-REMOVE REQ-',lvl_1))]]))]],
key = ('-FRAME LVL 1-',lvl_1),
relief = 'groove')]]
return layout
还有在 window.read 循环中:
elif event[0] == '-REMOVE REQ-' :
lvl_2 = lvl_counter[event[1]]
if lvl_2 >1:
window[f'-REQUIREMENT {event[1],lvl_2}-'].update(visible = False)
lvl_counter.update({event[1]:lvl_2-1})
window.refresh()
感谢你的时间
更新以回答评论:(代码比较大,所以我不想让内容太多)
与这个相关的元素
window[f'-REQUIREMENT {event[1],lvl_2}-'].update(visible = False)
在一个叫做 sg.Column(layout_requirement_frame(lvl_1,lvl_2),key = f'-SPEC REQUIREMENT {lvl_1}-')
的函数里。
这个函数在这里描述:(我还添加了里面调用的其他函数,方便你理解)
def layout_requirement_frame(lvl_1,lvl_2):
layout = [[sg.Frame(title = f'Requirement {lvl_2}',
layout = [[sg.Text ('Should have a '),
sg.Combo(categories_req, default_value=None, enable_events=True, key=('-FACET REQ-',lvl_1,lvl_2)),
sg.Text ('With')],
[sg.Column(layout_parameter_req(category_req,lvl_1,lvl_2),key = f'-REQ FACET PARAMETERS {lvl_1, lvl_2}-')]],
key = f'-REQUIREMENT {lvl_1,lvl_2}-',
relief = 'sunken')]]
return layout
def layout_parameter_req(category_req,lvl_1,lvl_2):
cat = category_req[(lvl_1,lvl_2)]
if cat == None :
layout = [[]]
else :
items = Facets[cat]['facet_parameters']
layout = [[sg.pin(sg.Frame(title = '',
layout = [[sg.Text (item['name'], size=(15, 1)),
sg.Input (key = ('req',cat, item['name'],lvl_1,lvl_2)),
sg.Text ('Required' if item['required'] else 'Optional',font=('Helvetica', 12, 'bold' if item['required'] else '')),
sg.Push (),
sg.Button('+')]for item in items],
key = f'- FRAME REQ{cat,lvl_1,lvl_2}-',
relief = 'flat'))]]
return layout
而这个框架是通过扩展布局添加的,就在这里:
elif event[0] == '-ADD REQ-' :
categories_req = categories.copy()
if values[('-FACET-',event[1])]:
categories_req.remove(values[('-FACET-',event[1])])
lvl_2 = lvl_counter[event[1]]+1 #retrieve the previous value (with the dict)
category_req.update({(event[1],lvl_2):None})
if f'-REQUIREMENT {event[1],lvl_2}-' in window.AllKeysDict:
window[f'-REQUIREMENT {event[1],lvl_2}-'].update(visible = True)
lvl_counter.update({event[1]:lvl_2})
else :
lvl_counter.update({event[1]:lvl_2})
window.extend_layout(window[f'-SPEC REQUIREMENT {event[1]}-'],layout_requirement_frame(event[1],lvl_2))
window[('-FACET REQ-',event[1],lvl_2)].update(values=categories_req)
1 个回答
1
我无法运行你的脚本来找出问题所在,但我把你的代码简化并修改成了下面这个脚本,它可以正常工作。
import PySimpleGUI as sg
def layout_specification_frame(lvl_1,lvl_2):
sub_frame = [
[sg.Text('All elements of'),
sg.Text ('That have a')],
[sg.Column([],key = f'-FACET PARAMETERS {lvl_1}-')],
]
column_layout = [
[sg.Button('Add another requirement', key = ('-ADD REQ-',lvl_1)),
sg.Button('Remove a requirement',key = ('-REMOVE REQ-',lvl_1))],
]
frame_layout = [
[sg.Text ('Name of the specification'),
sg.Input(key=('-SPECIFICATION TITLE-', lvl_1)),
sg.Text ('Select IFC Version:')],
[sg.Frame('Applicability', sub_frame, key=f'-APPLICABILITY {lvl_1}-', relief = 'sunken')],
[sg.Column(layout_requirement_frame(lvl_1,lvl_2),key = f'-SPEC REQUIREMENT {lvl_1}-')],
[sg.pin(sg.Column(column_layout))]],
layout = [[sg.Frame(f'Specification N° {lvl_1}', frame_layout, key=('-FRAME LVL 1-',lvl_1), relief='groove')]]
return layout
def layout_requirement_frame(lvl_1,lvl_2):
frame_layout = [
[sg.Text ('Should have a '),
sg.Text ('With')],
[sg.Column(layout_parameter_req(lvl_1,lvl_2),key=f'-REQ FACET PARAMETERS {lvl_1, lvl_2}-')],
]
layout = [[sg.pin(sg.Frame(f'Requirement {lvl_2}', frame_layout, key=f'-REQUIREMENT {lvl_1,lvl_2}-', relief = 'sunken'))]]
return layout
def layout_parameter_req(lvl_1,lvl_2):
items = []
frame_layout = [
[sg.Text(item, size=(15, 1)),
sg.Input(key=('req', item, lvl_1, lvl_2)),
sg.Text('Required'), sg.Push(), sg.Button('+')]
for item in items
]
layout = [[sg.pin(sg.Frame('', frame_layout, key=f'- FRAME REQ{lvl_1,lvl_2}-', relief='flat'))]]
return layout
lvl_1, lvl_2 = 1, 1
layout = layout_specification_frame(lvl_1,lvl_2)
window = sg.Window("Window Title", layout)
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event[0] == '-ADD REQ-' :
lvl_2 += 1
if f'-REQUIREMENT {lvl_1,lvl_2}-' in window.AllKeysDict:
window[f'-REQUIREMENT {lvl_1,lvl_2}-'].update(visible=True)
else :
window.extend_layout(window[f'-SPEC REQUIREMENT {lvl_1}-'],layout_requirement_frame(lvl_1,lvl_2))
elif event[0] == '-REMOVE REQ-' :
if lvl_2 > 1:
window[f'-REQUIREMENT {lvl_1,lvl_2}-'].update(visible=False)
lvl_2 -= 1
window.close()