<p>不确定这是否仍然相关,但我通过遵循PySimpleGUI的食谱中的<a href="https://pysimplegui.readthedocs.io/en/latest/cookbook/#recipe-collapsible-sections-visible-invisible-elements" rel="nofollow noreferrer">this</a>示例解决了这个问题</p>
<p>首先,创建一个helper函数,它返回一个固定的列(我从上面的链接复制了这个特定的代码,并通过bool<code>visible</code>对其进行了扩展。我还添加了<code>pad=(0,0)</code>,因为<code>sg.Column</code>使用了一个标准缩进,我们不希望在这里使用)</p>
<pre class="lang-py prettyprint-override"><code>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)))
</code></pre>
<p>当然,您也可以使用<code>pin</code>命令来隐藏和显示部分,但是定义一个函数会使它更简单、更美观。Column元素是一个容器元素,用于在窗口布局(<a href="https://pysimplegui.readthedocs.io/en/latest/call%20reference/#column-element" rel="nofollow noreferrer">source</a>)中创建布局</p>
<p>现在定义(子)布局,稍后要隐藏它</p>
<pre><code>section1 = [[sg.Text('SVAS Log File', size=(15,1), key= 'txt_svas'), sg.Input(key='svas'), sg.FileBrowse(target= 'svas')]]
...
</code></pre>
<p>创建分区后,现在可以使用分区和函数<code>collapse</code>创建最终布局。但是,要隐藏和显示这些部分,您还需要在如下复选框中启用事件:<code>[sg.Checkbox('generic_Label', enable_events=True, size=(x,y), key='some_key'), ...</code>在烹饪书中有一个<a href="https://pysimplegui.readthedocs.io/en/latest/cookbook/#use-enable_events-to-instantly-get-events" rel="nofollow noreferrer">section</a>专门用于此。
对于您的情况,布局如下所示:</p>
<pre><code>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)]]
</code></pre>
<p>使用<code>enable_event=True</code>复选框在其状态更改时触发事件。事件的名称是键。{a4}将如下所示:</p>
<p>使用创建窗口后</p>
<pre><code>window = sg.Window('Provident Logs Validator', layout, size=(600, 400))
</code></pre>
<p>您需要定义一些切换布尔值</p>
<pre><code>toggle_sec1 = toggle_sec2 = ... = False # Number of bools depends on number of Checkboxes / Sections you have
</code></pre>
<p>。
然后进入事件循环:</p>
<pre><code>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
</code></pre>
<hr/>
<p><strong>TL;DR</strong></p>
<p>定义函数</p>
<pre><code>def collapse(layout, key, visible)
return sg.pin(sg.Column(layout, key=key, visible=visible))
</code></pre>
<p>为要隐藏或显示的行或部分创建子布局:</p>
<pre><code>section = [[sg.ElementA(), sg.ElementB(), ...]]
...
</code></pre>
<p>请确保在复选框中输入参数<code>enable_event=True</code>,以触发给定节的显示或隐藏</p>
<p>像平常一样创建窗口布局(复选框的<code>enable_event=True</code>参数除外),并使用<code>collapse</code>函数添加部分</p>
<pre><code>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
]
</code></pre>
<p>创建窗口:</p>
<pre><code>window = sg.Window('Some Title', layout)
</code></pre>
<p>声明切换布尔值:</p>
<pre><code>toggle_bool1 = ... = False
</code></pre>
<p>创建事件循环并检查事件是否等于复选框的键:</p>
<pre><code>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
</code></pre>