我正在将我的应用程序从py2转换为py3。该过程包括从wxPython Classic迁移到Phoenix。
这是一个使用wxPython IEHtmlWindow
class的GUI应用程序。
当我执行应用程序时,我收到此错误:
OSError: exception: access violation reading 0xFFFFFFFF903EED60
Traceback (most recent call last):
File "P:\Python36\lib\site-packages\wx\lib\activex.py", line 154, in MSWTranslateMessage
res = self.ipao.TranslateAccelerator(msg)
鼠标在HTML窗口内的每次移动都会产生此错误。
尝试调试问题,我将Phoenix演示包中ActiveX_IEHtmlWindow.py示例的TestPanel代码复制到名为html.py
的python模块中(并将TestPanel
面板重命名为{{ 1}})。然后,我用最小的框架实例化演示IEHtml窗口:
HtmlWin
我按预期获得了Phoenix演示IEHtml窗口,但它也产生了相同的OSError。
我没有在Python 2.7上运行wxPython classic(vs 2.8)时出现此错误 这是windows 10,64bits和最近的凤凰释放(b2)
更新
正如Exception messsage所说,模块 activex.py 中类import wx
from html import HtmlWin
class HtmlFrame(wx.Frame):
def __init__(self, title):
wx.Frame.__init__(self, None, -1, title=title)
sizer = wx.BoxSizer(wx.VERTICAL)
self.html = HtmlWin(self, None)
sizer.Add(self.html, 1, flag=wx.EXPAND )
self.SetSizer(sizer)
self.Fit()
self.SetSize((768,550))
self.html.ie.AddEventSink(self)
class MyFrame(HtmlFrame):
def __init__(self, title):
HtmlFrame.__init__(self, title=title)
if __name__ == '__main__':
app = wx.App()
MyFrame(title='test').Show()
app.MainLoop()
的{{1}}函数发生异常。
MSWTranslateMessage
作为最后的解决方案,我在ActiveXctrl
行周围的def MSWTranslateMessage(self, msg):
# Pass native messages to the IOleInPlaceActiveObject
# interface before wx processes them, so navigation keys and
# accelerators can be dealt with the way that the AXControl
# wants them to be done. MSWTranslateMessage is called before
# wxWidgets handles and eats the navigation keys itself.
res = self.ipao.TranslateAccelerator(msg)
if res == hr.S_OK:
return True
else:
return super(ActiveXCtrl, self).MSWTranslateMessage(msg)
上捕获了例外情况。在此更改之后,IEHtmlWindow的功能似乎没有受到影响。
试图找出问题的线索,我抓住了产生异常的try/except
的值:
res = self.ipao.TranslateAccelerator(msg)
不知道这意味着什么。也许有人可以从这里给我一些提示,以一种干净的方式解决问题(不用try / except修改lib)