python - 在 PySimpleGUI 中隐藏和取消隐藏文本、输入和 FileBrowse()

标签 python python-3.x python-2.7 pysimplegui

我使用 PYSimpleGUI 制作了一个 GUI,看起来像这样

Click here to view 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)

最初下面的部分应该完全隐藏

      [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()]

并且应该根据我选择/取消选择的复选框选择性地切换可见/不可见。例如,如果我只选择 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()],

如果我取消选中它们,它们应该会再次隐形

如何实现这一目标?我是 Python 和 PySimpleGUI 的新手。

最佳答案

不确定这是否仍然相关,但我通过遵循 this 解决了这个问题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)))

当然,您也可以仅使用 pin 命令来隐藏和显示这些部分,但定义一个函数会使它更容易、更漂亮。 Column 元素是一个容器元素,用于在窗口布局 ( source ) 中创建布局。

现在您定义您的(子)布局,稍后您想要隐藏它。

section1 = [[sg.Text('SVAS Log File', size=(15,1), key= 'txt_svas'), sg.Input(key='svas'), sg.FileBrowse(target= 'svas')]]
...

创建部分后,您现在可以使用部分和函数collapse 创建最终布局。但是,要隐藏和显示这些部分,您还需要在复选框上启用事件,如下所示:[sg.Checkbox('generic_Label', enable_events=True, size=(x,y), key='some_key'), ... 有一个 section在专门致力于此的食谱中。 对于您的情况,布局将如下所示:

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)]]
         
         

使用enable_event=True,复选框在状态更改时会触发事件。事件的名称是关键。 event loop看起来像这样:

创建窗口后

window = sg.Window('Provident Logs Validator', layout, size=(600, 400))

你需要定义一些切换 bool 值

toggle_sec1 = toggle_sec2 = ... = False # Number of bools depends on number of Checkboxes / Sections you have

。 然后进入事件循环:

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

TL;DR

定义函数

def collapse(layout, key, visible)
    return sg.pin(sg.Column(layout, key=key, visible=visible))

为要隐藏或显示的行或部分创建子布局:

section = [[sg.ElementA(), sg.ElementB(), ...]]
...

请务必在复选框中输入参数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
         ]

创建窗口:

window = sg.Window('Some Title', layout)

声明切换 bool 值:

toggle_bool1 = ... = False

创建事件循环并检查事件是否等于复选框的键:

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

关于python - 在 PySimpleGUI 中隐藏和取消隐藏文本、输入和 FileBrowse(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61006988/

相关文章:

python - 使用 setup.py 构建轮子时是否可以排除某些文件?

python - 如何从github有效地将代码导入ipython

python - Keras module.summary() 结果 - 'output shape' 中的负维度值

python - 如何为Pyjulia 0.5.2添加处理器(addprocs)并将Julia函数的值返回给Python?

python-2.7 - 同一图上的 Python 并排箱线图

python - 将错误异常保存到文件错误中

Python-Requests : direct . pem 固定自签名证书

python - 改变不可调用模块的回溯

python - 运行时错误: Running cythonize failed! Statsmodels安装

linux - 在python gstreamer中寻找大的原始视频文件