WxPython+PySerial线程更新GUI触发空事件断言错误求助
解决wxAssertionError: NULL event can't be posted问题
嘿,这个问题的根源其实很明确——你的SerialRxEvent类里的Clone()方法写错了!
wxPython的事件系统要求,自定义事件必须正确实现Clone()方法,因为事件在通过AddPendingEvent加入队列时,内部会调用这个方法来复制事件实例。而你的代码里,Clone()只是创建了一个事件对象,但没有把它返回出去,导致实际返回的是None,对应到C++层面就是NULL事件,直接触发了那个断言错误。
具体错误代码
你现在的Clone方法是这样的:
def Clone(self): self.__class__(self.GetId(), self.data)
这段代码只实例化了一个SerialRxEvent,但没有用return把它返回,所以方法默认返回None,这就是问题所在。
修复方法
只需要给Clone方法加上return语句,返回新创建的事件实例就行:
class SerialRxEvent(wx.PyCommandEvent): eventType = SERIALRX def __init__(self, windowID, data): wx.PyCommandEvent.__init__(self, self.eventType, windowID) self.data = data def Clone(self): # 关键:返回新的事件实例 return self.__class__(self.GetId(), self.data)
额外验证
另外可以确认下事件绑定部分,你的EVT_SERIALRX绑定是没问题的,只要修复Clone方法,事件就能正常被投递到GUI线程,不会再出现那个断言错误了。
内容的提问来源于stack exchange,提问作者schanti schul
相关产品推荐
相关产品推荐

