wxPython菜单文本对齐

2 投票
2 回答
597 浏览
提问于 2025-04-17 19:53

我正在开发一个wxPython的图形界面,想把快捷键的文本右对齐。显然,可以用制表符来凑合一下,但如果有更好的方法,我更希望能直接实现。

默认创建菜单项的代码是这样的:

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 个回答

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,最后它也被用在加速器表中,这样用户就可以使用快捷键了。

这里有一些可能对你有帮助的参考资料:

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 键来选择它。

你可以通过在 item_name 文本中使用 & 符号来将 Alt 键关联起来,以快速打开菜单并导航到它,但你仍然需要通过 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 的地方,快捷方式都可以自动引用。这也会使更新变得更加顺畅。

撰写回答