wxPython - 如何从事件中获取 MenuItem?
wxPython - How to get MenuItem from event?
使用 wxPython,我有一个带有菜单和状态栏的框架设置。菜单是从一个缩进的文本文件生成的,我用它来创建一个漂亮的嵌套菜单栏,每个菜单项都绑定到一个特定的功能。我有一个 "Toggle Status Bar" 菜单检查项,它绑定了 OnToggleStatusBar()。
我想查看菜单项是否被选中并做出相应反应,但我似乎无法从事件中访问 menuItem。如果我使用 GetId(),如何使用它来查找菜单项?我用 FindWindowById() 尝试了 event.GetId() 但一无所获。我还尝试了 event.GetEventObject(),它返回了一个菜单而不是一个菜单项。
def OnToggleStatusBar(self, event):
id = event.GetId()
menu = event.GetEventObject()
menuItem = menu.FindWindowById(id) #does not work
print self.FindByWindowId(id) # prints None
有点复杂,但还算不错。基本上您需要使用菜单的 FindItem
方法,该方法采用菜单项的字符串名称。这个 returns 它的 id,然后你可以使用菜单的 FindItemById
方法。这是一个快速而肮脏的例子:
import wx
########################################################################
class MyForm(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="wx.Menu Tutorial")
self.panel = wx.Panel(self, wx.ID_ANY)
# Create menu bar
menuBar = wx.MenuBar()
# create check menu
checkMenu = wx.Menu()
wgItem = checkMenu.Append(wx.NewId(), "Wells Fargo", "", wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.onFargo, wgItem)
citiItem = checkMenu.Append(wx.NewId(), "Citibank", "", wx.ITEM_CHECK)
geItem = checkMenu.Append(wx.NewId(), "GE Money Bank", "", wx.ITEM_CHECK)
menuBar.Append(checkMenu, "&Check")
# Attach menu bar to frame
self.SetMenuBar(menuBar)
#----------------------------------------------------------------------
def onFargo(self, event):
""""""
menu = event.GetEventObject()
item_id = menu.FindItem("Wells Fargo")
item = menu.FindItemById(item_id)
print item.IsChecked()
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm().Show()
app.MainLoop()
您不需要查找该项目,您可以使用 wxMenuBar::IsChecked()
,它将直接为您完成。您可以只将菜单栏存储在 self.menuBar
中,也可以使用其 GetMenuBar()
方法从框架中检索它。
使用事件访问您想要的数据。
print event.Id
print event.Selection # returns 1 if checked 0 if not checked
print event.IsChecked() # returns True if checked False if not checked
打印出所有属性:
print dir(event)
使用 wxPython,我有一个带有菜单和状态栏的框架设置。菜单是从一个缩进的文本文件生成的,我用它来创建一个漂亮的嵌套菜单栏,每个菜单项都绑定到一个特定的功能。我有一个 "Toggle Status Bar" 菜单检查项,它绑定了 OnToggleStatusBar()。
我想查看菜单项是否被选中并做出相应反应,但我似乎无法从事件中访问 menuItem。如果我使用 GetId(),如何使用它来查找菜单项?我用 FindWindowById() 尝试了 event.GetId() 但一无所获。我还尝试了 event.GetEventObject(),它返回了一个菜单而不是一个菜单项。
def OnToggleStatusBar(self, event):
id = event.GetId()
menu = event.GetEventObject()
menuItem = menu.FindWindowById(id) #does not work
print self.FindByWindowId(id) # prints None
有点复杂,但还算不错。基本上您需要使用菜单的 FindItem
方法,该方法采用菜单项的字符串名称。这个 returns 它的 id,然后你可以使用菜单的 FindItemById
方法。这是一个快速而肮脏的例子:
import wx
########################################################################
class MyForm(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="wx.Menu Tutorial")
self.panel = wx.Panel(self, wx.ID_ANY)
# Create menu bar
menuBar = wx.MenuBar()
# create check menu
checkMenu = wx.Menu()
wgItem = checkMenu.Append(wx.NewId(), "Wells Fargo", "", wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.onFargo, wgItem)
citiItem = checkMenu.Append(wx.NewId(), "Citibank", "", wx.ITEM_CHECK)
geItem = checkMenu.Append(wx.NewId(), "GE Money Bank", "", wx.ITEM_CHECK)
menuBar.Append(checkMenu, "&Check")
# Attach menu bar to frame
self.SetMenuBar(menuBar)
#----------------------------------------------------------------------
def onFargo(self, event):
""""""
menu = event.GetEventObject()
item_id = menu.FindItem("Wells Fargo")
item = menu.FindItemById(item_id)
print item.IsChecked()
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm().Show()
app.MainLoop()
您不需要查找该项目,您可以使用 wxMenuBar::IsChecked()
,它将直接为您完成。您可以只将菜单栏存储在 self.menuBar
中,也可以使用其 GetMenuBar()
方法从框架中检索它。
使用事件访问您想要的数据。
print event.Id
print event.Selection # returns 1 if checked 0 if not checked
print event.IsChecked() # returns True if checked False if not checked
打印出所有属性:
print dir(event)