Как правильно создать несколько записей wx.AcceleratorEntry () и связать с ними функции? WxPython - PullRequest
0 голосов
/ 11 января 2020

В настоящее время я работаю над окончательным проектом для средней школы wx Python и столкнулся с другой проблемой. Я хотел бы связать записи комбинаций клавиш (например, CTRL + S ...) с моими функциями, но не могу достичь результата, который бы соответствовал моим ожиданиям.

Я пробовал это, но нажатия клавиш не были связаны.

accelnum = 2

        accelerators = [wx.AcceleratorEntry() for x in range(accelnum)]

        accelerators[0].Set(wx.ACCEL_CTRL, ord('S'), 'save')
        accelerators[1].Set(wx.ACCEL_CTRL, ord('E'), 'export')


        accel=wx.AcceleratorTable(accelerators)
        self.SetAcceleratorTable(accel)


def save(self, event):
        # some code...

def export(self, event):
        # some other code...

Я также пытался установить ID на тот же идентификатор, который я установил для инструментов панели инструментов, но он говорит, что здесь id не является допустимым аргументом.

Большое спасибо за все советы. R

РЕДАКТИРОВАТЬ

Для всех, кто интересуется, что может быть не так, я также использовал wx.EVT_CHAR_HOOK для обнаружения клавиши «DEL». Когда я переписывал свой класс во второй раз, я забыл добавить EVT_CHAR_HOOK, и это сработало. Пока я не добавил это EVT_CHAR_HOOK назад. Это означает, что вы не можете использовать его одновременно. Итак, что я сделал дальше:

ID_SAVE = wx.NewIdRef()
ID_EXPORT = wx.NewIdRef()
ID_DELETE = wx.NewIdRef()
accelerators = [wx.AcceleratorEntry() for x in range(3)]
accelerators[0].Set(wx.ACCEL_CTRL, ord('S'), ID_SAVE)
accelerators[1].Set(wx.ACCEL_CTRL, ord('E'), ID_EXPORT)
accelerators[2].Set(wx.ACCEL_NORMAL, wx.WXK_DELETE, ID_DELETE)

, чтобы назначить также мою кнопку удаления, и теперь она работает

Ответы [ 2 ]

1 голос
/ 11 января 2020

Ответ Робина, как всегда, действительно работает.
Вы можете sh проверить, как именно вы его реализуете.
Попробуйте что-то вроде этого:

import wx

ID_SAVE = wx.NewIdRef()
ID_EXPORT = wx.NewIdRef()
accelerators = [wx.AcceleratorEntry() for x in range(2)]
accelerators[0].Set(wx.ACCEL_CTRL, ord('S'), ID_SAVE)
accelerators[1].Set(wx.ACCEL_CTRL, ord('E'), ID_EXPORT)

class MyFrame(wx.Frame):
    def __init__(self, parent, id=wx.ID_ANY, title="", size=(360,100)):
        super(MyFrame, self).__init__(parent, id, title, size)
        accel=wx.AcceleratorTable(accelerators)
        self.SetAcceleratorTable(accel)
        self.panel = wx.Panel(self)
        self.Bind(wx.EVT_MENU, self.OnSave, id=ID_SAVE)
        self.Bind(wx.EVT_MENU, self.OnExport, id=ID_EXPORT)
        self.Show()

    def OnSave(self, event):
        print("Save")
        event.Skip()

    def OnExport(self, event):
        print("Export")
        event.Skip()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None,title="An Accelerator Test")
    app.MainLoop()

enter image description here

1 голос
/ 11 января 2020

См .: https://docs.wxpython.org/wx.AcceleratorEntry.html#wx .AcceleratorEntry.Set

3-й параметр Set должен быть идентификатором, который будет использоваться при создании и отправке события. Так что вместо этого вы захотите сделать что-то вроде этого:

    ID_SAVE = wx.NewIdRef()
    accelerators[0].Set(wx.ACCEL_CTRL, ord('S'), ID_SAVE)

Когда эта клавиша нажата, отправляется событие EVT_MENU, поэтому вам также необходимо привязать обработчик для этого, например это:

    self.Bind(wx.EVT_MENU, self.save, id=ID_SAVE)
...