События wxPython не обрабатываются? - PullRequest
0 голосов
/ 07 июня 2018

Я написал симулятор для микроконтроллера, где я передаю результаты функций с событиями в графический интерфейс.Проблема в том, что функции, связанные с событиями, никогда не вызывались.У меня есть графический интерфейс и симулятор в двух разных потоках.

'''Event class'''
NewRAMEvent = wx.NewEventType()
EVT_NEW_RAM = wx.PyEventBinder(NewRAMEvent, 1)

class RAM_Event(wx.PyCommandEvent):
    def __init__(self, location = None, val = None):
        wx.PyCommandEvent.__init__(self)
        self._location = location
        self._val = val

    def SetVals(self, val, loc):
        self._location = loc
        self._val = val

    def GetVal(self):
        return self._val

    def GetLocation(self):
        return self._location


    '''Creating event'''
    evt1 = RAM_Event(0x03, uC.programCounter)
    wx.CallAfter(recipient.ProcessEvent, evt1)
    print("RAM event sent")

    '''adding recipient to list and creating thread for simulator'''
    simuThread = SimulatorThread()
    simuThread.add_event_recipient(Myfrm)


    '''GUI class'''
    self.Bind(EVT_NEW_RAM, self.updateRAM)

    def updateRAM(self, event):
        print("received Event")
        location = event.GetLocation()
        value = event.GetVal()
        print("value:", value)
        RAM.writeToTable(self, location, value)
        return

Когда я смотрю на консоль, я вижу сообщение о том, что оно было отправлено, но не получено.

1 Ответ

0 голосов
/ 09 июня 2018

Ваш RAM_Event никогда не устанавливает тип события на NewRAMEvent.Возможно, вы захотите взглянуть на модуль wx.lib.newevent, так как он может позаботиться о большинстве этих деталей для вас.Вы можете создать новый тип события и класс события с помощью одной строки, например:

NewRAMEvent, EVT_NEW_RAM = wx.lib.newevent.NewCommandEvent()

Сгенерированный класс будет принимать произвольные параметры ключевых слов, которые он затем назначит в качестве атрибутов объекта.экземпляр класса.

Кроме того, wx.PostEvent(recipient, evt1) был бы немного лучшим способом отправки события, чем использование wx.CallAfter.Это в основном эквивалентно, но wx.PostEvent предназначено для событий и поэтому экономит несколько шагов внутри.

...