Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用wxPython菜单,ID:它意味着什么,我应该为X使用哪个?_Python_Wxpython - Fatal编程技术网

使用wxPython菜单,ID:它意味着什么,我应该为X使用哪个?

使用wxPython菜单,ID:它意味着什么,我应该为X使用哪个?,python,wxpython,Python,Wxpython,我正在开发一个wxPython应用程序。我正在处理菜单和菜单栏 到目前为止,我的代码如下: 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 =

我正在开发一个wxPython应用程序。我正在处理菜单和菜单栏

到目前为止,我的代码如下:

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()
我想在文件菜单中添加New、Open、Save、SaveAs,添加一个Actions菜单,并在其中放置Action1、Action2(临时名称)。我唯一的问题是:

首先,在语句
m_exit=menu.Append中(wx.ID_退出等…
wx.ID_退出意味着什么?我在哪里可以获得可能的ID列表?我不确定我将为新建、打开、保存、另存为等设置什么。我将设置OnNew、OnOpen等功能,但我不确定ID应该是什么。我听说了自定义ID,但我需要一个示例,因为我似乎找不到任何与此相关的功能kes对我来说很有意义。我看到你在Append()中使用它们,但没有在Bind()中使用它们。为什么要这样做?将它们传递给Append()的确切原因是什么?就像在m_exit(见下文)中一样,我使用wx.id_exit,但在Bind中我再也没有提到它,我只提到wx.EVT_菜单、要执行的函数和菜单的名称。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.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()
在它调用hwin.FindWindowById(wx.ID_OK)的地方,我看不出它是如何找到正确的窗口的。例如AboutBox显示about窗口,但在它的菜单中。Append它使用wx.ID_about,但wx.ID_OK工作正常。我现在正在尝试实现VersionBox。但我不确定如何将其更改为菜单中的.ID_about。Append()或者别的什么

如果现在还不清楚,我不明白这些ID,何时使用它们,使用哪些ID,以及它们如何与GetWindowById()交互,请澄清

我尝试按照示例和教程中看到的模式进行操作,但当我向菜单添加新菜单项时,它似乎永远不会工作。我没有收到错误消息,但程序会立即打开和关闭。我遵循以下代码:但除了他们已经添加的菜单项外,我似乎无法让任何菜单项工作。有什么想法吗

万分感谢,很抱歉容忍我,但我遇到了一些麻烦。即使回答我的一些问题或一些澄清,也会大大有助于我理解wxPython的工作原理

最终编辑:

我通过像OnAbout()方法一样使用wx.ID_来使用version。似乎如果我添加其他OnX()方法,即使它们没有绑定到任何东西,也会使程序混乱,为什么会这样

非常感谢,你的帮助引导我走上了正确的道路,如果有人能提供一些小例子,那将非常有帮助。如果没有,无论如何谢谢,我终于走上了正确的道路

  • wx.ID_EXIT是一个整数ID,wx保留了它,并且知道它的含义…还有其他的,比如
    wx.Button(self,wx.ID_OK)
    注意,我不需要传递字符串标签(使用wx.ID_EXIT,它也应该自动触发关闭事件(除非捕捉到菜单事件并将其短路),根据使用它们的上下文,它们的工作方式不同

    如果n.startswith(“ID””),您可以获得所有wx.ID\u XXX的列表,其中包含
    [n表示目录中的n(wx)]

  • wx.EVT_MENU是由任何菜单选择(包括加速器表热键)生成的命令事件,您可以通过在函数处理程序中使用
    dir(event)
    来查看它的内容……但我认为它只有默认的commandevent字段

  • APP\u-EXIT
    是程序员在某处编写的字符串,类似于
    APP\u-EXIT=.(“&EXIT”)
    。这是一种常见的做法,将所有大写字母都用作常量(这也有助于简化本地化)

  • wxPython将尝试解析您提供的任何热键组合,因此+/-可能并不重要(虽然这没有很好的文档记录,所以我不知道…您可以进行一些尝试和错误,并很容易找到答案)

  • 对于打开菜单选项,您可以执行以下操作

        m_open = menu.Append(wx.ID_OPEN,"&Open\tAlt-O)
    
    好的,这是wxPython2.8中的特殊ID列表

    >>> 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']
    >>>
    

    因此,如果我想编写菜单项“打开”、“新建”、“保存”、“另存为”和其他一些自定义操作,我如何知道要使用哪个整数ID?如果内置ID都不能满足我的需要,我如何创建自定义ID?你能提供一个这样做的简短示例吗?我在哪里可以找到ID\u PRG\u INFO之类的定义,有什么方法可以创建自定义ID?我仍然无法理解ID。如果您已经将其绑定到一个方法,为什么需要该ID?例如,我的示例代码使用ID_ABOUT而不是ID_PRG_INFO。在不明显的情况下,我如何知道使用哪个?这是一个新的customid查看上面的行…
    ID_PRG_INFO=wx.NewId()
    如果你应该使用一个ID,那么如果你不应该使用内置的wx.ID\u XXX,那么你应该使用一个自定义的ID……内置的ID有一点魔力(取决于上下文)(即按钮、菜单或对话框返回)我明白了。既然我绑定到了正确的方法,那么ID的意义是什么呢?为什么我需要一个ID?NewId()采用了哪些参数?例如,在示例中,它的ID_是关于而不是ID_PRG_INFO的。这些NewId()中放了什么对于更复杂的东西,如save、open.new等,您如何编写ID?我可以用wx.NewId()创建一个自定义的ne,但必须有更多的内容。否则ID的意义是什么?NewId()生成一个新的ID,以保证
    >>> 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']
    >>>