python - 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 输入框。
解决方案
您必须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
推荐阅读
- javascript - Discord.js 删除字段并将其替换为新字段
- python - Import Excel file Python Pandas (File not found)
- python - 为什么“if not a := say_empty()”会引发 SyntaxError?
- google-chrome - 在 chrome 网站和 chrome 扩展程序之间共享 cookie
- linux - hadoop安装,启动二级namenode、nodemanagers和resource manager
- javascript - HTML Select 无法在 javascript 中获取选定的值数据
- c - 如何遍历C中的整数位?
- c++ - 如何在 C++ 中定义队列溢出异常?
- git - Git:维护两个具有大多数共同特性的版本
- css - 类属性不适用于 wordpress 页面上的元素