如何在wxPython中获取所选菜单项?

2024-04-26 21:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的程序中,我有一个上下文菜单,其中有一个插入子菜单。我不想为子菜单中的每个选项设置不同的函数,而是将所有选项绑定到同一个函数上。有没有一种方法可以确定所选项目的标签或标识,以便将其传递给其他函数?在

编辑:经过一番研究,我找到了GetId()函数,这是我想要的,但我仍然需要从id中获取标签。我可能可以使用findWidowById,它是wx.窗口,但它只能透过窗户的孩子们看。框架似乎不是子菜单项的父项,所以我不能只做frame.FindWindowById(id)。在


Tags: 方法函数程序目的id编辑选项菜单
3条回答

它可能不漂亮,但我发现使用一个菜单Id范围的列表是有效的。它不仅易于理解,而且灵活,如:

import wx

class MenuCallback(wx.Frame):

    def __init__(self, *args, **kwds):
        self.frame=wx.Frame.__init__(self, *args, **kwds)
        self.menubar = wx.MenuBar()
        menu1 = wx.Menu()
        menu_item_1 = menu1.Append(wx.ID_OPEN, "&File")
        menu_item_2 = menu1.Append(wx.ID_EXIT, "&Exit...")
    #Build a list of things via another function or just a declaration
        self.list_of_things = ["Thing No 1", "Thing No 2", "Thing No 3"]
        list_used = wx.Menu()
        thing_count = 101

        for thing in self.list_of_things:
            t1 = wx.MenuItem(list_used, thing_count, thing)
            list_used.AppendItem(t1)
            thing_count +=1

        thing_end = wx.MenuItem(list_used,199,'End of List')
        list_used.AppendItem(thing_end)

        menu1.AppendMenu(wx.ID_FILE,'&Things',list_used)
        self.menubar.Append(menu1, "&File")
        self.SetMenuBar(self.menubar)
    # Create bindings for the Thing list
        i_count = 101
        for i in self.list_of_things:
            self.Bind(wx.EVT_MENU, self.OnThingOpen, id=i_count)
            i_count = i_count + 1
        self.Bind(wx.EVT_MENU, self.OnThingEnd, id=199)
        self.Bind(wx.EVT_MENU, self.OnClose, id=wx.ID_EXIT)
        self.Show(True)

    def OnThingOpen(self, event):
        id_index = 101
        id_selected = event.GetId()
        id_selected = id_selected - id_index
        print "Option =", id_selected
        print "Thing selected =", str(self.list_of_things[id_selected])

    def OnThingEnd(self, event):
        id_selected = event.GetId()
        print "Option =", id_selected

    def OnClose(self, event):
        self.Close()

    if __name__ == '__main__':
        app = wx.App()
        MC=MenuCallback(parent=None, id=-1)
        app.MainLoop()

使用partial将一个选项(一些唯一的ID)发送到一个公共函数。如果有很多菜单项,请使用for()循环,将返回值存储在列表中(而不是菜单项_x),并增加一个计数器以发送给函数。在

import wx
from functools import partial

class MenuCallback(object):

    def __init__(self, parent, id):
        self.frame=wx.Frame(None)
        menu_bar = wx.MenuBar()
        menu1 = wx.Menu()
        menu_item_1 = menu1.Append(-1, "&Option #1")
        menu_item_2 = menu1.Append(-1, "&Option #2")
        menu_item_3 = menu1.Append(-1, "&Exit...")

        menu_bar.Append(menu1, "&File")
        self.frame.SetMenuBar(menu_bar)
        self.frame.Bind(wx.EVT_MENU, partial(self.option_chosen, 1),
                        menu_item_1)
        self.frame.Bind(wx.EVT_MENU, partial(self.option_chosen, 2),
                        menu_item_2)
        self.frame.Bind(wx.EVT_MENU, self.on_close, menu_item_3)

        self.frame.Show(True)

    def option_chosen(self, number, event):
        print "option chosen =", number

    def on_close(self, event):
        self.frame.Close(True)

app = wx.PySimpleApp()
MC=MenuCallback(parent=None, id=-1)
app.MainLoop()

在为你的问题提供了一个解决方案后,我意识到应该有另一种方法来实现我的解决方案。事实上有,我也可以自己采用,因为它更干净,使用的内存更少。这使用event.GetEventObject()方法。在

import wx

class MenuCallback(wx.Frame):

    def __init__(self, *args, **kwds):
        self.frame=wx.Frame.__init__(self, *args, **kwds)
        self.menubar = wx.MenuBar()
#        self.statusbar = wx.StatusBar(self-1)
        self.CreateStatusBar()
        self.SetStatusText("Demonstration of wxPython")
        menu1 = wx.Menu()
        menu_item_1 = menu1.Append(wx.ID_OPEN, "&File")
        menu_item_2 = menu1.Append(wx.ID_EXIT, "&Exit...")
    #Build a list of things via another function or just a declaration
        self.list_of_things = ["Thing No 1", "Thing No 2", "Thing No 3"]
        list_used = wx.Menu()
        thing_count = 101

        for thing in self.list_of_things:
            t1 = wx.MenuItem(list_used, thing_count, thing)
            list_used.AppendItem(t1)
            thing_count +=1

        thing_end = wx.MenuItem(list_used,199,'End of List')
        list_used.AppendItem(thing_end)

        menu1.AppendMenu(wx.ID_FILE,'&Things',list_used)
        menu1.SetHelpString(wx.ID_FILE, 'Select from the list of things')

        self.menubar.Append(menu1, "&File")
        self.SetMenuBar(self.menubar)
    # Create bindings for the Thing list
        i_count = 101
        for i in self.list_of_things:
            self.Bind(wx.EVT_MENU, self.OnThingOpen, id=i_count)
            i_count = i_count + 1
        self.Bind(wx.EVT_MENU, self.OnThingEnd, id=199)
        self.Bind(wx.EVT_MENU, self.OnClose, id=wx.ID_EXIT)
        self.Show(True)

    def OnThingOpen(self, event):
        id_selected = event.GetId()
        obj = event.GetEventObject()
        print "Option =", id_selected
        print obj.GetLabel(id_selected)
        print "From the range:"
        for i in range(obj.MenuItemCount):
            print "\t\t", obj.MenuItems[i].GetLabel()

    def OnThingEnd(self, event):
        pass

    def OnClose(self, event):
        self.Close()

if __name__ == '__main__':
    app = wx.App()
    MC=MenuCallback(parent=None, id=-1)
    app.MainLoop()

相关问题 更多 >