2015-12-02 53 views
0

使用wxPython,我有一個菜單和狀態欄的框架設置。菜單是從一個縮進的文本文件生成的,我用它來創建一個不錯的嵌套菜單欄,每個菜單項綁定到一個特定的功能。我有一個「切換狀態欄」菜單檢查項綁定OnToggleStatusBar()。wxPython - 如何從事件中獲取MenuItem?

我想看看菜單項是否被選中並作出相應的反應,但我似乎無法從事件中訪問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 

回答

2

你並不需要直接找到該項目,則可以使用wxMenuBar::IsChecked(),這會爲你做它。您可以將菜單欄存儲在self.menuBar中,或者使用其GetMenuBar()方法從框架中檢索它。

+0

這正是我需要的東西 – Shatnerz

+0

將這項工作,如果我有一個是可檢查的多個項目?我認爲你需要一種方法來區分這種情況下的物品 –

+0

即使有多個物品,他們都必須有唯一的ID,那麼爲什麼會出現問題呢? –

0

這有點複雜,但不是太糟糕。基本上你需要使用菜單的FindItem方法,它採用菜單項的字符串名稱。這會返回它的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() 
0

使用該事件來訪問您想要的數據。

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) 
相關問題