4

我想知道是否有一种方法可以根据 PySimple GUI 中的按钮单击来管理不同的布局。我刚开始使用这个框架,我想找到导航菜单的最佳方式。不必使用不同的布局,但这只是让我想到了最直观的方式。

I was thinking like maybe having a list of layouts that get pushed to the top when a certain submenu button is selected.

layouts = [layout1, layout2, layout3, layout4]

或者也许启动程序:

layout = layout1

And when a submenu is selected just change the state to:

layout = layout2

因此,例如具有“主菜单”布局,并在单击按钮时将不同的布局或“子菜单”带到“前面”,以便整个程序在一个窗口中运行。也许看起来像这样:

主菜单

按钮 1

按钮 2

按钮 3

单击按钮 1 时,窗口保持打开状态,但显示变为子菜单 1。

在 PySimpleGui Docs 中,我使用了推荐用于构建某些程序的持久窗口循环:

import PySimpleGUI as sg

sg.theme('BluePurple')

layout = [[sg.Text('Your typed chars appear here:'), sg.Text(size=(15,1), key='-OUTPUT-')],
      [sg.Input(key='-IN-')],
      [sg.Button('Show'), sg.Button('Exit')]]

window = sg.Window('Pattern 2B', layout)

while True:  # Event Loop
    event, values = window.read()
    print(event, values)
    if event in  (None, 'Exit'):
        break
    if event == 'Show':
        # Update the "output" text element to be the value of "input" element
        window['-OUTPUT-'].update(values['-IN-'])

window.close()

我对完全改变结构持开放态度,但我想在开始构建功能之前先降低菜单导航。

  • 使用 PySimpleGUI==4.14.1
4

2 回答 2

11

你实际上非常接近。

这就是我认为你正在寻找的东西。您需要做的是将布局添加到 Column 元素。然后使所有列不可见,除了您希望可见的列。

这是一个好主意。

import PySimpleGUI as sg

# ----------- Create the 3 layouts this Window will display -----------
layout1 = [[sg.Text('This is layout 1 - It is all Checkboxes')],
           *[[sg.CB(f'Checkbox {i}')] for i in range(5)]]

layout2 = [[sg.Text('This is layout 2')],
           [sg.Input(key='-IN-')],
           [sg.Input(key='-IN2-')]]

layout3 = [[sg.Text('This is layout 3 - It is all Radio Buttons')],
           *[[sg.R(f'Radio {i}', 1)] for i in range(8)]]

# ----------- Create actual layout using Columns and a row of Buttons
layout = [[sg.Column(layout1, key='-COL1-'), sg.Column(layout2, visible=False, key='-COL2-'), sg.Column(layout3, visible=False, key='-COL3-')],
          [sg.Button('Cycle Layout'), sg.Button('1'), sg.Button('2'), sg.Button('3'), sg.Button('Exit')]]

window = sg.Window('Swapping the contents of a window', layout)

layout = 1  # The currently visible layout
while True:
    event, values = window.read()
    print(event, values)
    if event in (None, 'Exit'):
        break
    if event == 'Cycle Layout':
        window[f'-COL{layout}-'].update(visible=False)
        layout = layout + 1 if layout < 3 else 1
        window[f'-COL{layout}-'].update(visible=True)
    elif event in '123':
        window[f'-COL{layout}-'].update(visible=False)
        layout = int(event)
        window[f'-COL{layout}-'].update(visible=True)
window.close()

[编辑] PySimpleGUI GitHub 中添加了一个新的演示程序,名为“Demo_Column_Elem_Swap_Entire_Window.py”。您可以通过访问Trinket查看代码并在浏览器中运行它。

于 2019-12-28T23:36:03.000 回答
1

使用Google我发现没有办法用另一种布局替换一种布局。

PySimpleGUI Issues:更新表单布局 #117 ,

您只能在一个布局中创建所有元素,其中一些元素会隐藏并再次显示:

Reddit r/PySimpleGUI是否可以更新列/框架的布局?


tkinter一种流行的方法可用于Frame对小部件进行分组,然后隐藏/显示框架以更改窗口中的内容。似乎PySimpleGUI也有Frame,但我没有可以按预期工作的示例。

于 2019-12-27T14:58:07.707 回答