2

我正在开发一个 wxPython GUI,并希望右对齐快捷方式文本。显然,可以使用制表符来解决这个问题,但如果有办法,我更愿意在本地进行。

因此,默认菜单项创建是:

menu = wx.Menu()
item_id = 1
item_name = 'My menu item'
help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

我将使用快捷方式对此进行扩展,因此如果我使用标签,它将类似于:

item_name = 'My menu item\t\tCtrl+Alt+H'

但是,这涉及大量手动\t输入以确保所有内容都对齐,并且每当菜单项更改名称或添加其他项时,它们都可能需要更新。有没有办法解决这个问题,例如我没有看到自动将键绑定关联到菜单项的类方法?

编辑:我知道在传递类似 的文本时,如果在加速器表中存在与该 ID 关联的定义&My menu item,它会自动使用与指定 ID 关联的键绑定执行某些操作,对吗?

4

2 回答 2

2

我深入研究了其他几个应用程序的代码以找到答案。事实证明,默认行为\t并没有做它看起来会做的事情(即插入一个制表符),但被工具包明智地解释为正在做我想做的事情。因此,右对齐快捷方式的方法很简单:使用您想要的文本创建它,然后是\t<shortcut>(就像我上面所说的那样)。在我上面粘贴的示例代码中,如果我希望我的快捷方式是Ctrl + T,那么它应该是这样的:

menu = wx.Menu()
item_id = 1
item_name = 'My menu item\tCtrl+T'
help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

编辑:根据 Mike Driscoll 的非常有用的答案更新了以下部分。

请注意,这会创建快捷方式绑定(wxPython 会选择它),但它不能使用例如 Windows 上的 Alt 键来选择它。

您可以关联 Alt 键以快速打开菜单并使用文本中的 & 符号导航到它item_name,但您仍然需要通过以下方式手动关联所需的键绑定AcceleratorTable

menu = wx.Menu()
item_id = 1

# Ctrl+T is bound to the keybinding
accelerator_table = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('T'), item_id)])
self.setAcceleratorTable(accelerator_table)

# Ctrl+T is not included, but the menu item can be accessed via Alt key
item_name = '&My menu item'

help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

我想,这实际上是首选模式,因为在任何item_id被引用的地方,都可以自动引用快捷方式。这也将实现无缝更新。

于 2013-03-21T16:25:25.283 回答
1

虽然 Chris 关于在菜单中正确缩进键绑定的 "\t" 是正确的,但我并没有真正理解他通过使用 & 符号自动关联任何内容的意思。与号 (&) 确实允许用于键入 ALT 以打开文件菜单,然后如果您键入另一个应用了与号的字母,它将跳转到该菜单项,但 & 不连接菜单项到加速器表。这是通过菜单项的 ID 完成的。

请参阅以下代码:

import wx

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "wx.Menu Tutorial")

        self.panel = wx.Panel(self, wx.ID_ANY)

        menuBar = wx.MenuBar()
        fileMenu = wx.Menu()
        exitId = wx.NewId()
        exitMenuItem = fileMenu.Append(exitId, "&Exit/tCtrl+X",
                                       "Exit the application")
        self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
        menuBar.Append(fileMenu, "&File")
        self.SetMenuBar(menuBar)

        accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL,  ord('X'), exitId )])
        self.SetAcceleratorTable(accel_tbl)

    #----------------------------------------------------------------------
    def onExit(self, event):
        """"""
        self.Close()

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

请注意,exitId用于创建菜单项,将菜单项绑定到 EVT_MENU,最后在 AcceleratorTable 中使用,以便用户可以使用快捷键。

以下是一些可能有用的参考资料:

于 2013-03-21T17:51:04.037 回答