使用 wxPython 菜单,ID:这是什么意思,我应该为 X 使用哪个?
Using wxPython Menus, ID: What does it mean and Which should I use for X?
我有一个正在开发的 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()
我想将新建、打开、保存、另存为添加到文件菜单,添加一个操作菜单并在其中放置 Action1、Action2(临时名称)。我唯一的问题是:
首先,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,但是在 Bind 中我再也没有提到它我只提到 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()
它在哪里计算 hwin.FindWindowById(wx.ID_OK) 我不明白它是如何找到正确的 window。例如,AboutBox 显示 about window 但在它的 menu.Append 中它使用 wx.ID_ABOUT,但 wx.ID_OK 工作正常。我现在正在尝试实现 VersionBox。但我不确定将其更改为什么。 ID_ABOUT 就像在 menu.Append() 中一样?或者是其他东西。
如果我现在不明白这些 ID,何时使用它们,使用哪些以及它们如何与 GetWindowById() 交互,请说明...
我尝试遵循我在示例和教程中看到的模式,但是当我向菜单添加新的菜单项时,它似乎永远不会起作用。我没有收到错误消息,但程序会立即打开和关闭。我正在遵循以下代码:http://wiki.wxpython.org/wxPython%20by%20Example 但是除了已经添加的菜单项之外,我似乎无法使用任何菜单项。有任何想法吗 ?
谢谢一百万,很抱歉容忍我,但我遇到了一些麻烦。甚至回答我的一些问题或一些澄清也会帮助我理解 wxPython 的工作原理。
最终编辑:
我通过使用像 OnAbout() 方法这样的 wx.ID_ABOUT 使其与版本一起工作。似乎如果我添加其他 OnX() 方法,即使它们没有绑定任何东西也会使程序混乱,为什么会这样?
非常感谢,您的帮助为我指明了正确的方向,如果有人可以提供一些小示例,那将大有帮助。如果没有,谢谢,我终于走上正轨了。
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_")]
wx.EVT_MENU是任意菜单选择(包括快捷键table热键)产生的命令事件,在函数处理程序...但我认为它只有默认命令字段。
APP_EXIT
是程序员写在某个地方的字符串,例如 APP_EXIT=_("&Exit")
...这是将所有大写字母用于常量的常见做法(它也有助于简化本地化).
wxPython 会尝试解析你给它的任何热键组合,所以 +/- 可能无关紧要(虽然这没有很好的记录所以我不知道......你可以做一些试验和错误很容易找到)
menu = wx.Menu()
ID_PRG_NFO = wx.NewId()
m_about = menu.Append(ID_PRG_NFO, "Program &Info\tAlt-I", "Information about this program")
对于打开菜单选项,您可以这样做
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']
>>>
我有一个正在开发的 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()
我想将新建、打开、保存、另存为添加到文件菜单,添加一个操作菜单并在其中放置 Action1、Action2(临时名称)。我唯一的问题是:
首先,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,但是在 Bind 中我再也没有提到它我只提到 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()
它在哪里计算 hwin.FindWindowById(wx.ID_OK) 我不明白它是如何找到正确的 window。例如,AboutBox 显示 about window 但在它的 menu.Append 中它使用 wx.ID_ABOUT,但 wx.ID_OK 工作正常。我现在正在尝试实现 VersionBox。但我不确定将其更改为什么。 ID_ABOUT 就像在 menu.Append() 中一样?或者是其他东西。
如果我现在不明白这些 ID,何时使用它们,使用哪些以及它们如何与 GetWindowById() 交互,请说明...
我尝试遵循我在示例和教程中看到的模式,但是当我向菜单添加新的菜单项时,它似乎永远不会起作用。我没有收到错误消息,但程序会立即打开和关闭。我正在遵循以下代码:http://wiki.wxpython.org/wxPython%20by%20Example 但是除了已经添加的菜单项之外,我似乎无法使用任何菜单项。有任何想法吗 ?
谢谢一百万,很抱歉容忍我,但我遇到了一些麻烦。甚至回答我的一些问题或一些澄清也会帮助我理解 wxPython 的工作原理。
最终编辑:
我通过使用像 OnAbout() 方法这样的 wx.ID_ABOUT 使其与版本一起工作。似乎如果我添加其他 OnX() 方法,即使它们没有绑定任何东西也会使程序混乱,为什么会这样?
非常感谢,您的帮助为我指明了正确的方向,如果有人可以提供一些小示例,那将大有帮助。如果没有,谢谢,我终于走上正轨了。
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_")]
wx.EVT_MENU是任意菜单选择(包括快捷键table热键)产生的命令事件,在函数处理程序...但我认为它只有默认命令字段。
APP_EXIT
是程序员写在某个地方的字符串,例如APP_EXIT=_("&Exit")
...这是将所有大写字母用于常量的常见做法(它也有助于简化本地化).wxPython 会尝试解析你给它的任何热键组合,所以 +/- 可能无关紧要(虽然这没有很好的记录所以我不知道......你可以做一些试验和错误很容易找到)
menu = wx.Menu() ID_PRG_NFO = wx.NewId() m_about = menu.Append(ID_PRG_NFO, "Program &Info\tAlt-I", "Information about this program")
对于打开菜单选项,您可以这样做
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']
>>>