PySimpleGUI 列表框右键菜单

问题描述

我想知道,是否可以使右键菜单对列表框中的选定框起作用?

右键菜单示例

example of a right click menu

我已经成功地为整个列表框制作了一个右键菜单

layout = [
        [gui.ListBox(size=(35,22),key='chat',values=messages,right_click_menu=['&Right',['Delete','Favourite','Reply','copy','Edit']])],[gui.InputText(key='input',size=(25,10)),gui.Button('Send',bind_return_key=True,size=(9,1))]
    ]

但这不是我想要的。我想要:如果我右键单击列表框中的一个框,该框将被选中并且该菜单的操作将仅影响该框。假设我右键单击中间框并按删除,中间框将被删除。我知道如何处理单击菜单的事件,但截至目前,我无法实际判断单击了哪条消息。

解决方法

这是可能的,但需要 tkinter 代码和 hack PySimleGUI 代码。 这里是按钮 3 的新回调,但选择最近的一个,而不是精确的那个。也许 sg.Tablesg.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!','Edit']
cmd_layout = [[sg.Button(cmd,size=(10,1))] for cmd in command]
layout = [
    [sg.Listbox(values=messages,size=(35,key='chat'),sg.Column(cmd_layout)],finalize=True)
window['input'].expand(expand_x=True)

while True:

    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]

获取所选项目的索引

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...