无法从WxPython菜单项传递参数

时间:2015-04-26 17:29:54

标签: python wxpython

当我尝试将菜单按钮绑定到某个功能时,我无法获得合理的输出。首先,我传递一些项目在我的应用程序中创建一个菜单:

imported_applications = ["foo", "bar"]

application_menu = wx.Menu()

for app in imported_applications:
    # Create Items
    item = wx.MenuItem(application_menu, wx.ID_ANY, app, )
    application_menu.Append(item)

    # Bind to function
    self.Bind(wx.EVT_MENU, self.select_application, item, id=app)

# Add to menubar
menubar.Append(application_menu, '&Applications')

self.SetMenuBar(menubar)

然后我在调用select_application时尝试获取该参数:

def select_application(self, event):

    id_selected = event.GetId()
    print(id_selected)

输出:

-2014
-2015

不知道它来自何处,但我希望它输出我在bind设置的ID。 imported_applications的内容是两个字符串,即[" foo"," bar]

2 个答案:

答案 0 :(得分:0)

app = [ "foo", "bar", ]
for app in ...

此处,您的 app 变量会被覆盖。

答案 1 :(得分:0)

您没有正确追加项目。wx.Menu需要其Append方法的其他参数。如果按原样运行该代码,则应该收到错误。相反,您将要使用AppendItem。如果您希望在事件处理程序中打印菜单标签,那么您必须从事件中提取id并使用该标签获取标签的文本。这是一个演示就是这样:

import wx

class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "wx.Menu Tutorial")

        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        menuBar = wx.MenuBar()
        fileMenu = wx.Menu()

        imported_applications = ["foo", "bar"]
        for item in imported_applications:
            item = wx.MenuItem(fileMenu, wx.ID_ANY, item)
            fileMenu.AppendItem(item)
            self.Bind(wx.EVT_MENU, self.onMenuPress, item)

        menuBar.Append(fileMenu, "&File")

        self.SetMenuBar(menuBar)

    #----------------------------------------------------------------------
    def onMenuPress(self, event):
        """"""
        menu_id = event.GetId()
        obj = event.GetEventObject()
        menu_label = obj.GetLabelText(menu_id)
        print menu_label

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()