使用wxPython菜单,ID:这是什么意思?我应该用哪个来表示X?

2024-09-24 22:29:14 发布

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

我正在开发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_EXIT, etc...语句中wx.ID_出口卑鄙?我在哪能得到可能的身份证?我不确定我会为New、Open、Save、SaveAs等设置什么。我将使用OnNew、OnOpen等函数,但我不确定ID应该是什么。我听说过自定义ID,但我需要一个例子,因为我似乎找不到任何对我有意义的东西。我看到您在Append()中使用了它们,而不是Bind()。为什么要这么做?将它传递给Append()的原因到底是什么?就像在m出口(见下文),我使用wx.ID_出口,但在《绑定》里我再也没提过,我只是提过wx.EVT_菜单,要执行的函数和菜单。附加(). 这些项目是如何相互作用的??在

编辑:

我试过这个代码:

^{pr2}$

它没有工作,应用程序打开,然后立即关闭,当我删除所有东西,但关闭,它再次工作。显然是我的新身份证()变量不起作用?我在创造我自己的错误是什么新身份证或为更多菜单和菜单项设置菜单栏。我知道我至少做错了一件事。有谁能帮我弄清楚它是什么,并提出实现目标的最佳方法吗?在

编辑(续):

我有两个类wx.对话框. 代码如下:

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_确定)我不知道怎么找到正确的窗口。例如,AboutBox显示about窗口,但是菜单。附加它使用wx.ID泳,但是wx.ID_确定工作正常。我现在正在尝试实现VersionBox。但我不知道该怎么改。我想在菜单。附加()? 或者别的什么。在

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

我试图遵循我在示例和教程中看到的模式,但当我向菜单中添加新的菜单项时,它似乎永远不起作用。我没有收到错误消息,但程序会立即打开和关闭。我遵循以下代码:http://wiki.wxpython.org/wxPython%20by%20Example但除了已经添加的菜单项之外,我似乎无法使任何菜单项正常工作。有什么想法吗?在

万分感谢,很抱歉忍受我,但我有点麻烦。即使是回答我的一些问题或是澄清一些问题,也会帮助我更好地理解wxPython是如何工作的。在

最终编辑:

我通过使用wx.ID泳比如OnAbout()方法。似乎如果我添加了其他OnX()方法,即使它们没有绑定到任何会扰乱程序的东西,为什么会这样呢?在

非常感谢,你的帮助指引了我正确的道路,如果有人能提供一些小的例子,这将是很大的帮助。如果没有,不管怎样,谢谢我终于走上正轨了。在


Tags: selfidinitbinddef菜单evtmenu
1条回答
网友
1楼 · 发布于 2024-09-24 22:29:14
  1. 在wx.ID_出口是wx保留的一个整数ID,它知道。。。还有其他一些,比如wx.Button(self,wx.ID_OK)注意,我不需要传递字符串标签(带wx.ID_出口它也应该自动触发close事件(除非你捕捉到菜单事件并将其短路),根据它们所使用的上下文,这些事件的工作方式不同

    你可以得到所有wx.ID_XXX使用[n for n in dir(wx) if n.startswith("ID_")]

  2. 在wx.EVT_菜单是由任何菜单选择(包括快捷键表热键)生成的命令事件,您可以通过在函数处理程序中使用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")
    

打开菜单选项

^{pr2}$

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

相关问题 更多 >