这是可能的,但需要 tkinter 代码和破解 PySimleGUI 代码。
这里是按钮 3 的新回调,但选择最近的一个,而不是精确的那个。或许sg.Table或sg.Tree可以实现更好的选择。
import PySimpleGUI as sg
def RightClickMenuCallback(event, element):
widget = element.Widget
current = widget.curselection()
if current:
widget.selection_clear(current[0])
index = widget.nearest(event.y)
widget.selection_set(index)
element.TKRightClickMenu.tk_popup(event.x_root, event.y_root, 0)
element.TKRightClickMenu.grab_release()
messages = [
'This is the start of your chat!',
'demo messages',
'dont know what to right',
]
command = ['Delete', 'Favourite', 'Reply', 'Copy', 'Edit']
layout = [
[sg.Listbox(size=(35, 22), key='chat', values=messages,
right_click_menu=['&Right', command])],
[sg.InputText(key='input', size=(25, 10)),
sg.Button('Send', bind_return_key=True, size=(9, 1))],
]
window = sg.Window("Test", layout, finalize=True)
chat = window['chat']
chat.Widget.bind('<Button-3>', lambda event,
element=chat: RightClickMenuCallback(event, element))
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
print(event, values)
window.close()
[编辑]
IMO,最好按照图书馆提供的方式。
import PySimpleGUI as sg
messages = [
'This is the start of your chat!',
'demo messages',
'dont know what to right',
]
command = ['Delete', 'Favourite', 'Reply', 'Copy', 'Edit']
cmd_layout = [[sg.Button(cmd, size=(10, 1))] for cmd in command]
layout = [
[sg.Listbox(values=messages, size=(35, 22), key='chat'),
sg.Column(cmd_layout)],
[sg.InputText(key='input', size=(25, 10)),
sg.Button('Send', bind_return_key=True, size=(9, 1))],
]
window = sg.Window("Test", layout, finalize=True)
window['input'].expand(expand_x=True)
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
print(event, values)
window.close()
如果您需要在单击鼠标按钮 1 时生成事件,请将选项 enable_events=True 添加到 sg.Listbox。当任何事件产生时,您可以通过values['chat']或window['chat'].get()获取此列表框中当前选择的项目列表,现在只有一个项目被选择,所以消息是values['chat'][0]。
如果你需要索引,你必须调用window['chat'].get_indexes(),它返回当前选择的项目作为索引列表。所以,同样的,通过window['chat'].get_indexes()[0]获取所选项目的索引