在 wxPython 中填充快捷方式编辑器

Populating Shortcut Editor in wxPython

我正在尝试制作一个带有热键的程序来复制和粘贴,我希望用户能够自定义按键。 link here 提供了 3 种填充列表的方法,我认为使用快捷方式管理器的第三个选项效果最好,但我找不到检索用户输入的新热键的方法快捷方式编辑器对话框关闭。谁有办法做到这一点?

我发现 ShortcutEditor 有点像猪,因为它在不告诉您原因的情况下就失败了,除非至少有一个菜单项设置了位图。 ??(您需要提供自己的图片。)
参见:

    editsc = wx.MenuItem(editmenu, wx.NewIdRef(), 'Edit Shortcuts')
    editsc.SetBitmap(wx.Bitmap('./myimage1.png'))
    editmenu.Append(editsc)

也就是说,它确实会触发 events,可以根据您的目的查询。
这是一个简短的示例,其中可以在 Edit 菜单中找到 Edit Shortcuts 工具。

编辑快捷方式时,将显示并打印给定菜单项的旧快捷方式和新快捷方式。

import wx
import wx.lib.agw.shortcuteditor as SE

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(400, 600))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.CreateStatusBar()

        # Setting up the menus
        filemenu = wx.Menu()
        editmenu = wx.Menu()
        infomenu = wx.Menu()
        # file menu
        filemenu.Append(wx.ID_OPEN, "Open\tCtrl+V")
        filemenu.Append(wx.ID_SAVE, "Save")
        filemenu.Append(wx.ID_SAVEAS, "Save as")
        filemenu.Append(wx.ID_EXIT, '&Quit', 'Quit application')
        # edit menu
        editmenu.Append(wx.ID_COPY, "Copy")
        editsc = wx.MenuItem(editmenu, wx.NewIdRef(), 'Edit Shortcuts')
        editsc.SetBitmap(wx.Bitmap('./myimage1.png'))
        editmenu.Append(editsc)
        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")

        # Creating the menubar.
        self.menubar = wx.MenuBar()
        # Add menus
        self.menubar.Append(filemenu, "&File")
        self.menubar.Append(editmenu, "&Edit")
        self.menubar.Append(infomenu, "&Help")
        # Adding the MenuBar to the Frame content.
        self.SetMenuBar(self.menubar)
        # bind file menu
        self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
        self.Bind(wx.EVT_MENU, self.OnSc, id=editsc.GetId())
        self.Bind(wx.EVT_MENU, self.OnMenu, id=wx.ID_OPEN)

        self.Show(True)

    def OnMenu(self, event):
        print ("Menu item selected")

    #Edit shortcuts
    def OnSc(self, event):
        dlg = SE.ShortcutEditor(self)
        dlg.Bind(SE.EVT_SHORTCUT_CHANGED, self.SEchanges)
        dlg.FromMenuBar(self)

        if dlg.ShowModal() == wx.ID_OK:
            # Changes accepted, send back the new shortcuts to the wx.MenuBar
            dlg.ToMenuBar(self)

        dlg.Destroy()

    #Check which item changed via the shortcut event
    def SEchanges(self, event):
        sc = event.GetShortcut()
        # On my OS a continuation character follows Ctrl, Alt, Shift etc
        # meaning the definition has not finished yet
        if ord(sc.accelerator[-1]) > 300:
            return
        msg = "Id "+sc.label+" Changed from "+sc.originalAccelerator+" to "+sc.accelerator
        print(msg)
        wx.MessageBox(msg, 'Changes', wx.OK | wx.ICON_INFORMATION)

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


app = wx.App(False)
frame = MainWindow(None, "Shortcut Editor")
app.SetTopWindow(frame)
app.MainLoop()