【问题标题】:wxPython events not handled?wxPython 事件未处理?
【发布时间】:2018-06-07 12:07:24
【问题描述】:

我为微控制器编写了一个模拟器,我将函数的结果与事件一起传递给 GUI。问题是绑定到事件的函数从未被调用。 我在两个不同的线程中有 GUI 和模拟器。

'''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

当我查看控制台时,我看到消息已发送但未收到。

【问题讨论】:

    标签: event-handling wxpython


    【解决方案1】:

    您的RAM_Event 永远不会将其事件类型设置为NewRAMEvent。您可能想查看wx.lib.newevent 模块,因为它可以为您处理大部分这些细节。您只需一行即可创建新的事件类型和事件类,例如:

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

    生成的类将接受任意关键字参数,然后将其分配为类实例的属性。

    另外,wx.PostEvent(recipient, evt1) 发送事件的方式比使用 wx.CallAfter 更好一些。它基本上是等效的,但wx.PostEvent 是为事件设计的,因此它在内部节省了一些步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多