wxPython:带有动态数据的PopupMenu



我有下面的代码。最终的目标是,当你点击时,PopupMenu的内容可以延迟。内容将从文件中加载并放入选项中。这工作。我把问题限定在下面的代码中。所期望的是,当你在框架中右键单击时,你会得到一个带有2个选项的弹出菜单"one_answers";menu2"。这工作。如果选择"菜单1",则选择"命令1"。应打印并用于"menu ", "Command 2"但是这两个选项都会打印"Command 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()

请参阅相关文章:与bind和wxpython在列表中的位置

最新更新