wxpython 工具栏菜单键盘导航

问题描述

我一直在为盲人开发一个应用程序,所以我决定为 GUI 使用 python 和 wxPython。问题是我无法使用选项卡导航 wx.toolbar。这是我的实际代码

    menuToolBar = self.CreatetoolBar(style=wx.TB_FLAT)
    menuToolBar.AddSeparator()
    menuToolBar.AddTool(ID_NUEVO,"Nuevo Archivo",wx.Bitmap(
        os.path.join(self.__rutaPrincipal,"img/nueva pagina.png")),"Nuevo Archivo")
    menuToolBar.AddSeparator()
    menuToolBar.AddTool(ID_GUARDAR_ARCHIVO,"Guardar Archivo","img/guardar pagina.png")),"Guardar Archivo")
    menuToolBar.AddTool(ID_ABRIR_ARCHIVO,"Abrir Página","img/abrir pagina.png")),"Abrir Página")
    menuToolBar.AddSeparator()
    menuToolBar.AddTool(ID_FOCUS_PANEL_ESCRITURA,"Foco Escritura","img/panel escritura.png")),"Foco Escritura")
    menuToolBar.AddTool(ID_FOCUS_PANEL_RESULTADO,"Foco Resultado","img/panel resultado.png")),"Foco Resultado")
    menuToolBar.AddSeparator()
    menuToolBar.AddTool(ID_CERRAR_PAGINA,"Cerrar Página","img/cerrar pagina.png")),"Cerrar Página")
    menuToolBar.AddSeparator()

    menuToolBar.Realize()

有什么配置可以实现吗?或者也许还有其他组件可以帮助我? PD我是 Python 开发和 Stackoverflow 的新手

解决方法

您需要在您的 Accelerators 以及可能的 MenuBar 中实现 MenuItem

加速器表允许应用程序为菜单或按钮命令指定键盘快捷键表。

通常,这些是使用菜单项中的文本设置的,绕过 wx.AcceleratorTable

p1 = wx.MenuItem(playm,wx.NewIdRef(),'&Play\tCtrl+P')

此处的 &PlayP 设置为菜单加速键,并将 Ctrl+P 设置为菜单项所代表功能的热键。
换句话说,在导航菜单时,按 P 将选择播放菜单项。不导航菜单时,只需按 Ctrl+P 即可运行该功能。
注意

  • 您不必同时设置。
  • 不要在单个菜单或菜单栏中多次将 & 与符号放在同一个字母前,因为只有第一个会起作用。
    例如“&Save”和“另存为”会起作用,使用 S 表示“保存”,使用 V 表示“另存为”

要访问菜单快捷方式,请按 Alt 按钮,然后按任何带下划线的字母。

一些带有菜单加速器但没有指定热键的最小代码:

import wx

class MainWindow(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,title=title,size=(200,100))
        self.control = wx.TextCtrl(self,style=wx.TE_MULTILINE)
        # A Statusbar in the bottom of the window
        self.CreateStatusBar()

        # Setting up the menus
        '''Define main items'''
        filemenu = wx.Menu()
        editmenu = wx.Menu()
        infomenu = wx.Menu()
        '''Items'''
        # file menu
        menu_open = filemenu.Append(wx.ID_OPEN,"Open")
        filemenu.Append(wx.ID_NEW,"New")
        filemenu.Append(wx.ID_SAVE,"Save")
        filemenu.Append(wx.ID_SAVEAS,"Save as")
        filemenu.Append(wx.ID_EXIT,'&Quit','Quit application')
        filemenu.AppendSeparator()
        filemenu.Append(wx.ID_PRINT,"&Print")
        filemenu.Append(wx.ID_PRINT_SETUP,"Print setup")
        filemenu.Append(wx.ID_PREVIEW,"Preview")
        # edit menu
        editmenu.Append(wx.ID_COPY,"Copy")
        editmenu.Append(wx.ID_CUT,"Cut")
        editmenu.Append(wx.ID_PASTE,"Paste")
        editmenu.AppendSeparator()
        editmenu.Append(wx.ID_UNDO,"Undo")
        editmenu.Append(wx.ID_REDO,"Re-do it")
        # info menu
        infomenu.Append(wx.ID_ABOUT,"About")
        '''Bind items for activation'''
        # bind file menu
        self.Bind(wx.EVT_MENU,self.OnExit,id=wx.ID_EXIT)
        self.Bind(wx.EVT_MENU,self.OnOpen)

        # Creating the menubar.
        menuBar = wx.MenuBar()
        # Add menus
        menuBar.Append(filemenu,"&File")
        menuBar.Append(editmenu,"&Edit")
        menuBar.Append(infomenu,"&Help")
        # Adding the MenuBar to the Frame content.
        self.SetMenuBar(menuBar)
        self.Show(True)

    def OnOpen(self,event):
        print ("Menu item selected")
        # event skip as we want to continue checking events in case Quit was chosen
        event.Skip()

    def OnExit(self,event):
        self.Destroy()


app = wx.App(False)
frame = MainWindow(None,"Sample editor")
app.MainLoop()

运行此代码并按 Alt 键,按未划线的字母 F、E 或 H 之一,然后使用箭头键或任何带下划线的字母导航菜单。

注意某些功能会自动分配热键,例如Ctrl+Q 是退出。

,

我没有删除现有的 anwser(实际上它回答了一个不同的问题),而是将其留在原处,因为我个人认为它以相关的方式很有用。

这是我在评论中提到的一个例子,关于制作自己的工具栏,您可以使用 Tab、左箭头和右箭头键导航。
这应该足以让您入门。

它使用一个普通按钮和一些通用位图按钮,两者都可以工作,因为我们需要说明当前哪个按钮具有焦点,这是通过为每个按钮使用至少 2 个不同的位图来实现的。一个普通,一个聚焦。

struct SomeData {
  let `1. Information`: String
}

enter image description here

enter image description hereenter image description here enter image description here test.pngtestfocus.png