首页 > 解决方案 > PySimpleGUI 中的弹出窗口,用于显示对象列表,然后将所选对象放入输入框中

问题描述

我正在尝试创建一个在按下 SELECTION 按钮时触发的弹出窗口。它应该显示来自特定 Excel 表的列,用户可以选择条目,这将填充 STRATEGY 输入框。

我有这个代码:

import PySimpleGUI as sg
import pandas as pd

columns = ["STRATEGY", "FOR_SHOW"]
param = (20,3) # size of the main window

df_strategies = pd.read_excel(r'path/Strategies.xlsx', 'Strategies')

def GUI(df_strategies):
    sg.theme('Dark Brown 1')
    listing = [sg.Text(u, size = param) for u in columns]
    core = [
    sg.Input(size = param, key='STRATEGY'),
    sg.Listbox(list(df_strategies['STRATEGIES ']), size=(20,2), enable_events=False)
    ]

    mesh = [[x,y] for (x,y) in list(zip(listing, core))]
    layout =[[sg.Button("SEND")]]+ mesh
    mesh[0].append(sg.Button('SELECTION'))
    window = sg.Window('GUI', layout, font='Courier 12').Finalize()
    while True:
        event, values = window.read()
        if event == sg.WINDOW_CLOSED:
            break
        elif event == "SEND":
            break
        elif event == 'SELECTION':
            sg.popup_scrolled(list(df_strategies['STRATEGIES ']))

        else:
            print("OVER")
    window.close()
GUI(df_strategies)

不幸的是,这个 sg.popup_scrolled 只显示文本本身,没有实际选择的选项。

本质上,我正在尝试创建与 FOR_SHOW 列表框非常相似的东西,除了它显示在弹出窗口中并且所选条目填充 STRATEGY 输入框。

标签: pythonpysimplegui

解决方案


您必须popup从头开始创建自己的 - 而不是使用popup_scrolled- 然后您可以使用Listbox和/或其他小部件。

import PySimpleGUI as sg
import pandas as pd

# --- functions ---

def GUI_POPUP(text, data):

    layout = [
        [sg.Text(text)],
        [sg.Listbox(data, size=(20,5), key='SELECTED')],
        [sg.Button('OK')],
    ]
    
    window = sg.Window('POPUP', layout).Finalize()
    
    while True:
        event, values = window.read()

        if event == sg.WINDOW_CLOSED:
            break
        elif event == 'OK':
            break
        else:
            print('OVER')

    window.close()

    print('[GUI_POPUP] event:', event)
    print('[GUI_POPUP] values:', values)

    if values and values['SELECTED']:
        return values['SELECTED']
        
    
def GUI_MAIN(data):

    strategies = data['STRATEGIES'].tolist()
    for_show = data['FOR_SHOW'].tolist()
    
    layout = [
        [sg.Button('SEND')],
        [sg.Text('STRATEGY', size=(20,1)), sg.Input(size=(20,1), key='STRATEGY'), sg.Button('SELECTION')],
        [sg.Text('FOR_SHOW', size=(20,1)), sg.Listbox(for_show, size=(20,5), key='FOR_SHOW', enable_events=False)],
    ]

    window = sg.Window('GUI', layout).Finalize()
    
    while True:
        event, values = window.read()
        
        if event == sg.WINDOW_CLOSED:
            break
        elif event == 'SEND':
            break
        elif event == 'SELECTION':
            selected = GUI_POPUP('STRATEGY', strategies)
            print('selected:', selected)
            if selected:
                
                window['STRATEGY'].update(selected[0])
                
                mask = (data['STRATEGIES'] == selected[0])
                for_show = data['FOR_SHOW'][ mask ].tolist() 

                window['FOR_SHOW'].update(for_show)

        else:
            print('OVER') 

    window.close()

    print('[GUI_MAIN] event:', event)
    print('[GUI_MAIN] values:', values)
    
# --- main ---

if __name__ == '__main__':    
    #df_strategies = pd.read_excel(r'path/Strategies.xlsx', 'Strategies')
    df_strategies = pd.DataFrame({
        'STRATEGIES': ['A', 'B', 'C'],
        'FOR_SHOW': [1, 2, 3]
    })
                
    GUI_MAIN(df_strategies)

在此处输入图像描述


顺便提一句:

使用print( sg.__file__ )您可以获得源代码的路径
,您可以检查如何popup_scrolled创建并使用它来创建自己的弹出窗口。

在我的 Linux Mint 上,我有源代码

/usr/local/lib/python3.8/dist-packages/PySimpleGUI


推荐阅读