Добавление редактора ярлыков в wxPython - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать программу с горячими клавишами для копирования и вставки, и я хочу, чтобы пользователь мог настраивать нажатия клавиш. Ссылка здесь предоставляет 3 метода для заполнения списка, и я думаю, что третий вариант с использованием диспетчера ярлыков подойдет лучше всего, но я не могу найти способ получить новые горячие клавиши, введенные пользователем, когда редактор ярлыков диалог закрывается. У кого-нибудь есть способ сделать это?

1 Ответ

1 голос
/ 27 мая 2020

Я обнаружил, что ShortcutEditor немного похож на свинью, поскольку он явно терпит неудачу, не сообщая вам почему, , если хотя бы один из пунктов меню не имеет установленного растрового изображения. ?? (Вам нужно будет предоставить свое собственное изображение.)
См .:

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

Тем не менее, он запускает events, который может быть запрошен для ваших целей.
Вот краткий пример, в котором возможность Edit Shortcuts находится в меню Edit.

При редактировании ярлыка отображается и распечатывается старый ярлык и новый ярлык для данного пункта меню.

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()

enter image description here

enter image description here

enter image description here

...