2015-05-26 22 views
1

我有一個我正在開發的wxPython應用程序。我正在研究菜單和菜單欄。使用wxPython菜單,ID:這是什麼意思,我應該用於X?

到目前爲止,這裏是我的代碼有:

class Frame(wx.Frame): 
    def __init__(self, title): 
     wx.Frame.__init__(self, None, title=title, pos=(150,150), size= (350,200)) 
     self.Bind(wx.EVT_CLOSE, self.OnClose) 

     menuBar = wx.MenuBar() 

     menu = wx.Menu() 
     m_exit = menu.Append(wx.ID_EXIT, "&Exit\tAlt-X", 
      "Close window and exit program.") 
     self.Bind(wx.EVT_MENU, self.OnClose, m_exit) 

     menu = wx.Menu() 
     m_about = menu.Append(wx.ID_ABOUT, "&About", "Information about this  program") 
     self.Bind(wx.EVT_MENU, self.OnAbout, m_about) 
     menuBar.Append(menu, "&Help") 

     self.SetMenuBar(menuBar) 

     self.statusbar = self.CreateStatusBar() 

     panel = wx.Panel(self) 
     box = wx.BoxSizer(wx.VERTICAL) 

     m_text = wx.StaticText(panel, -1, "Hello World!") 
     m_text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     m_text.SetSize(m_text.GetBestSize()) 
     box.Add(m_text, 0, wx.ALL, 10) 

     m_close = wx.Button(panel, wx.ID_CLOSE, "Close") 
     m_close.Bind(wx.EVT_BUTTON, self.OnClose) 
     box.Add(m_close, 0, wx.ALL, 10) 

     panel.SetSizer(box) 
     panel.Layout() 

    def OnClose(self, event): 
     dlg = wx.MessageDialog(self, 
      "Do you really want to close this application?", 
      "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION) 
     result = dlg.ShowModal() 
     dlg.Destroy() 
     if result == wx.ID_OK: 
      self.Destroy() 

    def OnAbout(self, event): 
     dlg = AboutBox() 
     dlg.ShowModal() 
     dlg.Destroy() 

我想新建,打開,保存,另存爲添加到文件菜單,添加一個操作菜單,並在其中提出措施1,措施2(臨時名稱)。我唯一的問題是這些:

首先,在聲明m_exit = menu.Append(wx.ID_EXIT, etc... wx.ID_EXIT是什麼意思?我在哪裏可以獲得可能的ID列表?我不確定我要爲New,Open,Save,SaveAs等設置什麼。我將創建OnNew,OnOpen等功能,但我不確定該ID應該是什麼。我聽說過自定義ID,但我需要一個例子,因爲我似乎無法找到任何對我有意義的事情。我看到你在Append()中使用它們而不是Bind()。爲什麼要這樣?將它傳遞給Append()的原因究竟是什麼?就像在m_exit中一樣(見下文),我使用wx.ID_EXIT,但是在綁定中我再也沒有提到它,我只提到wx.EVT_MENU,要執行的函數和menu.Append()的名稱。這些項目如何相互作用?

編輯:

我試過這段代碼:

menu = wx.Menu() 
    ID_FILE_NEW = wx.NewId() 
    m_new = menu.Append(wx.ID_FILE_NEW, "&New\tCtrl+N", "txt") 
    self.Bind(wx.EVT_MENU, self.OnNew, m_new)  

    ID_FILE_OPEN = wx.NewId() 
    m_open = menu.Append(wx.ID_FILE_OPEN, "&Open\tCtrl+O", "txt") 
    self.Bind(wx.EVT_MENU, self.OnOpen, m_open) 

    ID_FILE_SAVE = wx.NewId() 
    m_save = menu.Append(wx.ID_FILE_SAVE, "&Save\tCtrl+S", "txt") 
    self.Bind(wx.EVT_MENU, self.OnSave, m_save) 

    ID_FILE_SAVE_AS = wx.NewId() 
    m_save_as = menu.Append(wx.FILE_SAVE_AS, "&SaveAs", "txt") 
    self.Bind(wx.EVT_MENU, self.OnSaveAs, m_save_as) 

    m_exit = menu.Append(wx.ID_EXIT, "&Exit\tCtrl+X", 
     "Close window and exit program.") 
    self.Bind(wx.EVT_MENU, self.OnClose, m_exit) 

    menuBar.Append(menu, "&File") 

它沒有工作,打開應用程序,然後關閉瞬間,當我刪除一切,但m_close,它再次工作。顯然我的wx.NewId()變量不工作?我在創建自己的wx.NewId或設置菜單欄以獲得更多菜單和菜單項時做了什麼錯誤。我知道我至少在做這些事情中的一個錯誤。任何人都可以幫我弄清楚它是什麼,並提出完成目標的最佳方法?

編輯續:

我有一個從派生的wx.Dialog兩班。下面是代碼:

class AboutBox(wx.Dialog): 
def __init__(self): 
    wx.Dialog.__init__(self, None, -1, "About", 
     style=wx.DEFAULT_DIALOG_STYLE|wx.THICK_FRAME|wx.RESIZE_BORDER| 
      wx.TAB_TRAVERSAL) 
    hwin = HtmlWindow(self, -1, size=(400,200)) 
    vers = {} 
    vers["python"] = sys.version.split()[0] 
    vers["wxpy"] = wx.VERSION_STRING 
    hwin.SetPage(aboutText % vers) 
    btn = hwin.FindWindowById(wx.ID_OK) 
    irep = hwin.GetInternalRepresentation() 
    hwin.SetSize((irep.GetWidth() + 25, irep.GetHeight() + 10)) 
    self.SetClientSize(hwin.GetSize()) 
    self.CentreOnParent(wx.BOTH) 
    self.SetFocus() 

class VersionBox(wx.Dialog): 
def __init__(self): 
    wx.Dialog.__init__(self, None, -1, "Version", 
     style=wx.DEFAULT_DIALOG_STYLE|wx.THICK_FRAME|wx.RESIZE_BORDER| 
      wx.TAB_TRAVERSAL) 
    hwin = HtmlWindow(self, -1, size=(400, 200)) 
    vers = {} 
    vers["python"] = sys.version.split()[0] 
    vers["wxpy"] = wx.VERSION_STRING 
    hwin.SetPage(versionText % vers) 
    btn = hwin.FindWindowById(wx.ID_OK) 
    irep = hwin.GetInternalRepresentation() 
    hwin.SetSize((irep.GetWidth() + 25, irep.GetHeight() + 10)) 
    self.SetClientSize(hwin.GetSize()) 
    self.CentreOnParent(wx.BOTH) 
    self.SetFocus() 

凡CALS hwin.FindWindowById(wx.ID_OK)我不明白它是如何找到正確的窗口。例如AboutBox顯示關於窗口,但在其菜單中。添加它使用wx.ID_ABOUT,但wx.ID_OK正常工作。我現在試圖實現VersionBox。但我不知道該怎麼改變。 ID_ABOUT就像在menu.Append()中那樣?或者是其他東西。

如果不是很明顯現在我不明白這些ID的,何時使用它們,用哪些,以及他們如何與GetWindowById(),請澄清互動...

我嘗試按照我在示例和教程中看到的模式,但是當我將新的菜單項添加到菜單時,它似乎永遠不會工作。我沒有收到錯誤消息,但程序立即打開並關閉。我正在關注此代碼:http://wiki.wxpython.org/wxPython%20by%20Example但我似乎無法獲得任何菜單項,除了他們已添加的內容外。有任何想法嗎 ?

非常感謝A Million,抱歉抱着我,但我遇到了一些麻煩。即使回答我的一些問題或澄清,也可以幫助我理解wxPython的工作原理。

最後編輯:

我得到了它的版本工作,通過使用wx.ID_ABOUT像OnAbout()方法。似乎如果我添加其他OnX()方法,即使它們沒有綁定任何東西來擾亂程序,爲什麼會這樣呢?

非常感謝,您的幫助引導了我正確的方式,如果有人能夠提供一些小例子,這將有很大幫助。如果沒有,謝謝無論如何,我終於走上了正軌。

回答

2
  1. wx.ID_EXIT是WX預留了一個整數ID的知道的...還有其他如wx.Button(self,wx.ID_OK)通知我並不需要通過一個字符串標籤(與wx.ID_EXIT它應該會自動的意義觸發關閉事件,以及(除非您捕捉菜單事件和短路的話),這些作品不同,這取決於它們在

    使用的情況下,你可以得到所有的wx.ID_XXX的列表,[n for n in dir(wx) if n.startswith("ID_")]

  2. wx.EVT_MENU是任何菜單選項生成的命令事件(包括acce lerator table hotkeys),你可以在函數處理函數裏看到dir(event) ......但我認爲它只有默認的commandevent字段。

  3. APP_EXIT是一個字符串程序員寫了一些像APP_EXIT=_("&Exit")這樣的東西...這是常用的所有大寫字母的常用做法(它也有助於簡化本地化)。

  4. 的wxPython將試圖解析任何熱鍵組合,你給它這樣+/-可能並不重要(雖然這不是很好記錄,所以我不知道...你可以做一些試驗和錯誤,並找出很容易)

    menu = wx.Menu() 
    ID_PRG_NFO = wx.NewId() 
    m_about = menu.Append(ID_PRG_NFO, "Program &Info\tAlt-I", "Information about this  program") 
    

的OPEN菜單選項,你可以做

m_open = menu.Append(wx.ID_OPEN,"&Open\tAlt-O) 

確定這裏是特殊的ID在wxPython2.8

列表
>>> import wx 
>>> [n for n in dir(wx) if n.startswith("ID_")] 
['ID_ABORT', 'ID_ABOUT', 'ID_ADD', 'ID_ANY', 'ID_APPLY', 'ID_BACKWARD', 'ID_BOLD 
', 'ID_CANCEL', 'ID_CLEAR', 'ID_CLOSE', 'ID_CLOSE_ALL', 'ID_CONTEXT_HELP', 'ID_C 
OPY', 'ID_CUT', 'ID_DEFAULT', 'ID_DELETE', 'ID_DOWN', 'ID_DUPLICATE', 'ID_EDIT', 
'ID_EXIT', 'ID_FILE', 'ID_FILE1', 'ID_FILE2', 'ID_FILE3', 'ID_FILE4', 'ID_FILE5 
', 'ID_FILE6', 'ID_FILE7', 'ID_FILE8', 'ID_FILE9', 'ID_FIND', 'ID_FORWARD', 'ID_ 
HELP', 'ID_HELP_COMMANDS', 'ID_HELP_CONTENTS', 'ID_HELP_CONTEXT', 'ID_HELP_INDEX 
', 'ID_HELP_PROCEDURES', 'ID_HELP_SEARCH', 'ID_HIGHEST', 'ID_HOME', 'ID_IGNORE', 
'ID_INDENT', 'ID_INDEX', 'ID_ITALIC', 'ID_JUSTIFY_CENTER', 'ID_JUSTIFY_FILL', ' 
ID_JUSTIFY_LEFT', 'ID_JUSTIFY_RIGHT', 'ID_LOWEST', 'ID_MORE', 'ID_NEW', 'ID_NO', 
'ID_NONE', 'ID_NOTOALL', 'ID_OK', 'ID_OPEN', 'ID_PAGE_SETUP', 'ID_PASTE', 'ID_P 
REFERENCES', 'ID_PREVIEW', 'ID_PREVIEW_CLOSE', 'ID_PREVIEW_FIRST', 'ID_PREVIEW_G 
OTO', 'ID_PREVIEW_LAST', 'ID_PREVIEW_NEXT', 'ID_PREVIEW_PREVIOUS', 'ID_PREVIEW_P 
RINT', 'ID_PREVIEW_ZOOM', 'ID_PRINT', 'ID_PRINT_SETUP', 'ID_PROPERTIES', 'ID_RED 
O', 'ID_REFRESH', 'ID_REMOVE', 'ID_REPLACE', 'ID_REPLACE_ALL', 'ID_RESET', 'ID_R 
ETRY', 'ID_REVERT', 'ID_REVERT_TO_SAVED', 'ID_SAVE', 'ID_SAVEAS', 'ID_SELECTALL' 
, 'ID_SEPARATOR', 'ID_SETUP', 'ID_STATIC', 'ID_STOP', 'ID_UNDELETE', 'ID_UNDERLI 
NE', 'ID_UNDO', 'ID_UNINDENT', 'ID_UP', 'ID_VIEW_DETAILS', 'ID_VIEW_LARGEICONS', 
'ID_VIEW_LIST', 'ID_VIEW_SMALLICONS', 'ID_VIEW_SORTDATE', 'ID_VIEW_SORTNAME', ' 
ID_VIEW_SORTSIZE', 'ID_VIEW_SORTTYPE', 'ID_YES', 'ID_YESTOALL', 'ID_ZOOM_100', ' 
ID_ZOOM_FIT', 'ID_ZOOM_IN', 'ID_ZOOM_OUT'] 
>>> 
+0

因此,如果我想編寫菜單項Open,New,Save,SaveAs和一些其他自定義操作,我如何知道使用哪個整數ID?如果沒有內置的產品滿足我的需求,我該如何定製產品?你能舉一個簡單的例子嗎? – shenk

+0

好的,有一個簡短的例子 –

+0

我在哪裏可以找到像ID_PRG_INFO之類的東西的定義,並且有沒有辦法制作自定義ID?我仍然無法理解身份證。如果你已經將它綁定到一個方法,你爲什麼需要這個ID?例如,我的示例代碼使用ID_ABOUT而不是ID_PRG_INFO。當它不明顯時,我怎麼知道該使用哪一個? – shenk