如何解决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',1)),sg.Input(size=(20,1),key='STRATEGY'),sg.Button('SELECTION')],[sg.Text('FOR_SHOW',sg.Listbox(for_show,key='FOR_SHOW',enable_events=False)],]
window = sg.Window('GUI',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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。