Uma*_*tia 3 python python-2.7 python-3.x pysimplegui
我使用 PYSimpleGUI 制作了一个 GUI,看起来像这样
其代码如下:
import PySimpleGUI as sg
sg.theme('Light Blue 2')
layout = [[sg.Text('Choose files to get started', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Select Logs you wish to validate', size=(30, 1), justification='left', font=("Helvetica", 15), relief=sg.RELIEF_RIDGE)],
[sg.Text('_' * 100, size=(65, 1))],
[sg.Checkbox('SVAS Log', size=(10,1), key='chk_svas'), sg.Checkbox('HSS Log', size=(10,1), key = 'chk_hss'), sg.Checkbox('AOTA Log', size=(10,1), key = 'chk_aota'), sg.Checkbox('Nexus Log', size=(10,1), key = 'chk_nexus')],
[sg.Button('Get Inputs')],
[sg.Text('_' * 100, size=(65, 1))],
[sg.Text('Request File', size=(15,1)), sg.Input(key='req'), sg.FileBrowse()],
[sg.Text('SVAS Log File', size=(15,1), key= 'txt_svas'), sg.Input(key='svas'), sg.FileBrowse(target= 'svas')],
[sg.Text('HSS Log File', size=(15,1)), sg.Input(key='hss'), sg.FileBrowse()],
[sg.Text('AOTA Log File', size=(15,1)), sg.Input(key='aota'), sg.FileBrowse()],
[sg.Text('Nexus Log File', size=(15,1)), sg.Input(key='nexus'), sg.FileBrowse()],
[sg.Submit('Generate Logs'), sg.Cancel('Quit'), sg.Button('Reset')],
[sg.Text('Generating Validation Logs...', size=(30,1), visible = False, key = 'progbar_head')],
[sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progbar', visible = False)]]
window = sg.Window('Provident Logs Validator', layout, size=(600, 400))
while True:
event, values = window.read()
if event == 'Quit':
break
print(event, values)
Run Code Online (Sandbox Code Playgroud)
最初,下面的部分应该完全隐藏
[sg.Text('SVAS Log File', size=(15,1), key= 'txt_svas'), sg.Input(key='svas'), sg.FileBrowse(target= 'svas')],
[sg.Text('HSS Log File', size=(15,1)), sg.Input(key='hss'), sg.FileBrowse()],
[sg.Text('AOTA Log File', size=(15,1)), sg.Input(key='aota'), sg.FileBrowse()],
[sg.Text('Nexus Log File', size=(15,1)), sg.Input(key='nexus'), sg.FileBrowse()]
Run Code Online (Sandbox Code Playgroud)
并且应该根据我选择/取消选择的复选框选择性地切换可见/不可见。例如,如果我只选择 SVAS 和 HSS 的复选框,则只有以下内容应可见:
[sg.Text('SVAS Log File', size=(15,1), key= 'txt_svas'), sg.Input(key='svas'), sg.FileBrowse(target= 'svas')],
[sg.Text('HSS Log File', size=(15,1)), sg.Input(key='hss'), sg.FileBrowse()],
Run Code Online (Sandbox Code Playgroud)
如果我取消选中它们,它们应该会再次消失
如何才能实现这一目标?我是 Python 和 PySimpleGUI 的新手。
小智 5
不确定这是否仍然相关,但我通过遵循PySimpleGUI 食谱中的示例解决了这个问题。
首先,创建一个辅助函数,它返回一个固定列(我从上面的链接复制了这个特定的代码,并通过 bool 扩展了它visible。我还添加了pad=(0,0)因为sg.Column使用了我们不想要的标准缩进。):
def collapse(layout, key, visible):
"""
Helper function that creates a Column that can be later made hidden, thus appearing "collapsed"
:param layout: The layout for the section
:param key: Key used to make this section visible / invisible
:param visible: visible determines if section is rendered visible or invisible on initialization
:return: A pinned column that can be placed directly into your layout
:rtype: sg.pin
"""
return sg.pin(sg.Column(layout, key=key, visible=visible, pad=(0,0)))
Run Code Online (Sandbox Code Playgroud)
当然,您也可以只使用pin命令来隐藏和显示部分,但定义一个函数会使它更容易、更漂亮。Column 元素是一个容器元素,用于在窗口布局 ( source ) 中创建布局。
现在您定义了您稍后想要隐藏的(子)布局。
section1 = [[sg.Text('SVAS Log File', size=(15,1), key= 'txt_svas'), sg.Input(key='svas'), sg.FileBrowse(target= 'svas')]]
...
Run Code Online (Sandbox Code Playgroud)
创建部分后,您现在可以使用部分和函数创建最终布局collapse。但是,要隐藏和显示这些部分,您还需要在复选框上启用事件,如下所示:食谱中[sg.Checkbox('generic_Label', enable_events=True, size=(x,y), key='some_key'), ...有一个专门致力于此的部分。对于您的情况,布局将如下所示:
layout = [[sg.Text('Choose files to get started', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Select Logs you wish to validate', size=(30, 1), justification='left', font=("Helvetica", 15), relief=sg.RELIEF_RIDGE)],
[sg.Text('_' * 100, size=(65, 1))],
[sg.Checkbox('SVAS Log', enable_events=True, size=(10,1), key='chk_svas'), sg.Checkbox('HSS Log', enable_events=True, size=(10,1), key = 'chk_hss'), sg.Checkbox('AOTA Log', enable_events=True, size=(10,1), key = 'chk_aota'), sg.Checkbox('Nexus Log', enable_events=True, size=(10,1), key = 'chk_nexus')],
[sg.Button('Get Inputs')],
[sg.Text('_' * 100, size=(65, 1))],
[sg.Text('Request File', size=(15,1)), sg.Input(key='req'), sg.FileBrowse()],
[collapse(section1, 'sec_1', False)],
[collapse(section2, 'sec_2', False)],
... , # Same goes for all the other sections you want to create
[sg.Submit('Generate Logs'), sg.Cancel('Quit'), sg.Button('Reset')],
[sg.Text('Generating Validation Logs...', size=(30,1), visible = False, key = 'progbar_head')],
[sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progbar', visible = False)]]
Run Code Online (Sandbox Code Playgroud)
当复选框enable_event=True的状态发生变化时,会触发一个事件。事件的名称是关键。事件循环如下所示:
创建窗口后
window = sg.Window('Provident Logs Validator', layout, size=(600, 400))
Run Code Online (Sandbox Code Playgroud)
你需要定义一些切换布尔值
toggle_sec1 = toggle_sec2 = ... = False # Number of bools depends on number of Checkboxes / Sections you have
Run Code Online (Sandbox Code Playgroud)
。然后进入事件循环:
while True:
event, values = window.read()
if event == 'chk_svas':
toggle_sec1 = not toggle_sec1
window['sec_1'].update(visible=toggle_sec1)
if event == 'chk_hss':
toggle_sec2 = not toggle_sec2
window['sec_2'].update(visible=toggle_sec2)
...
if event == 'Quit' or event == sg.WIN_CLOSED:
break
Run Code Online (Sandbox Code Playgroud)
长话短说
定义函数
def collapse(layout, key, visible)
return sg.pin(sg.Column(layout, key=key, visible=visible))
Run Code Online (Sandbox Code Playgroud)
为要隐藏或显示的行或部分创建子布局:
section = [[sg.ElementA(), sg.ElementB(), ...]]
...
Run Code Online (Sandbox Code Playgroud)
请务必在复选框中输入enable_event=True您想要触发显示或隐藏给定部分的参数。
像平常一样创建窗口布局(enable_event=True复选框的参数除外)并添加带有函数的部分collapse。
layout = [list_of_elements_a,
list_of_elements_b,
[sg.Checkbox('Some Label', enable_events=true, key='checkbox_key')],
collapse(section, 'section_key', False),
... ,
list_of_elements_c
]
Run Code Online (Sandbox Code Playgroud)
创建窗口:
window = sg.Window('Some Title', layout)
Run Code Online (Sandbox Code Playgroud)
声明切换布尔值:
toggle_bool1 = ... = False
Run Code Online (Sandbox Code Playgroud)
创建事件循环并检查事件是否等于复选框的键:
while True:
event, values = window.read()
if event == 'checkbox_key':
toggle_bool1 = not toggle_bool1
window['section_key'].update(visible=toggle_bool1)
...
if event == 'Quit' or event == sg.WIN_CLOSED:
break
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11392 次 |
| 最近记录: |