微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wxPython:带有动态数据的 PopupMenu

如何解决wxPython:带有动态数据的 PopupMenu

我有下面的代码。 最终目标是,PopupMenu 的内容可以在您单击时延迟。 内容将从文件中加载并放入选项中。 这样可行。 我将问题限制在下面的代码中。 所期望的是,当您在框架中单击鼠标右键时,您会得到一个带有 2 个选项“menu1”和“menu2”的 PopupMenu。这样可行。 如果您选择“菜单 1”,则应打印“命令 1”,而对于“菜单 2”,则应打印“命令 2” 但两个选项都会打印“命令 2”。

有什么帮助吗?

import wx


def on_right_click(event):
    menu = wx.Menu()
    options = [{'msg': 'menu1','cmd': 'command 1'},{'msg': 'menu2','cmd': 'command 2'}]
    for option in options:
        menu_item = menu.Append(wx.ID_ANY,option['msg'])
        menu.Bind(
            event=wx.EVT_MENU,handler=lambda x: print(option['cmd']),source=menu_item
        )
    frame.PopupMenu(menu,event.GetPosition())
    menu.Destroy()


app = wx.App()
frame = wx.Frame(parent=None,title='Hello World')
frame.Bind(wx.EVT_RIGHT_DOWN,on_right_click)

frame.Show()
app.MainLoop()

解决方法

lambda 中的变量值是在执行时计算的,因此返回值总是最后一个值的结果。
您可以通过使用索引并将其增加到无效的索引值来测试这一点,所有 lambda 都将因索引错误而失败。
答案是扩展您的 lambda 参数以修复该值。
例如

import wx

def on_right_click(event):
    menu = wx.Menu()
    options = [{'msg': 'menu1','cmd': 'command 1'},{'msg': 'menu2','cmd': 'command 2'},{'msg': 'menu3','cmd': "I can't believe"},{'msg': 'menu4','cmd': "it's not butter"}]
    for option in options:
        menu_item = menu.Append(wx.ID_ANY,option['msg'])
        menu.Bind(
            event=wx.EVT_MENU,handler=lambda x,current_cmd = option['cmd']: print(current_cmd),source=menu_item
        )
    frame.PopupMenu(menu,event.GetPosition())
    menu.Destroy()


app = wx.App()
frame = wx.Frame(parent=None,title='Right Click to Test')
frame.Bind(wx.EVT_RIGHT_DOWN,on_right_click)

frame.Show()
app.MainLoop()

请参阅此相关帖子:position in a list with bind and wxpython

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。