wxPython菜单文本对齐方式

时间:2013-03-21 15:52:23

标签: python menu wxpython keyboard-shortcuts

我正在开发一个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条目以确保所有内容排队,并且只要菜单项更改名称或添加其他项目,它们都可能需要更新。有没有办法解决这个问题,例如:我没有看到一个类方法自动将键绑定与菜单项相关联?

编辑:我知道在传递&My menu item这样的文字时,如果有关联的定义,它会自动使用与指定ID相关联的键绑定 在加速器表中使用该ID,是否正确?

2 个答案:

答案 0 :(得分: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的very helpful answer更新了以下部分。

请注意,这会创建快捷方式绑定(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的任何地方,快捷方式都可以自动引用。这也可以实现无缝更新。

答案 1 :(得分:1)

虽然Chris正确地在菜单中正确地缩进了键盘绑定,但我并没有真正看到自动使用&符号关联任何内容的含义。 &符号(&amp;)DOES允许用户键入ALT以打开文件菜单,然后如果您键入另一个已经应用了&符号的字母,它将跳转到该菜单项,但&amp;不将菜单项连接到加速器表。这是通过菜单项的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中使用,以便用户可以使用快捷键。

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