升级旧wxPython应用:调用父类方法时触发无效窗口错误
问题:wxPython 4.0升级中ScrolledPanel的Layout方法触发断言错误
正在将基于Python 2.7、wxWidgets/wxPython 2.8开发的旧应用Debreate升级适配Python 3.10与wxPython 4.0版本,在调用父类方法时遇到错误,涉及类继承自wx.ScrolledWindow。
旧代码片段(ui/panel.py第74行开始)
def SetScrollbars(window): if isinstance(window, wx.ScrolledWindow): window.SetScrollbars(20, 20, 0, 0) ## A wx.ScrolledWindow that sets scrollbars by default class ScrolledPanel(wx.ScrolledWindow, PanelBase): def __init__(self, parent, win_id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.HSCROLL|wx.VSCROLL, name="scrolledPanel"): wx.ScrolledWindow.__init__(self, parent, win_id, pos, size, style, name) SetScrollbars(self) ## Override inherited method to also update the scrollbars def Layout(self): layout = wx.ScrolledWindow.Layout(self) self.UpdateScrollbars() return layout
报错信息
File "ui/panel.py", line 87, in Layout layout = wx.ScrolledWindow.Layout(self) wx._core.wxAssertionError: C++ assertion "m_widget" failed at ../src/gtk/window.cpp(2888) in DoSetSize(): invalid window
尝试的修改
将第87行修改为使用super()调用父类方法:
- layout = wx.ScrolledWindow.Layout(self) + layout = super().Layout()
修改后的报错
File "/home/jordan/Development/Debreate/code/ui/panel.py", line 87, in Layout layout = super().Layout() wx._core.wxAssertionError: C++ assertion "m_widget" failed at ../src/gtk/window.cpp(2888) in DoSetSize(): invalid window
分析
两种调用父类方法的方式逻辑上都正确,问题不在调用方式本身。当前系统wxWidgets版本为3.0.5.1,查看wxWidgets源码可知,断言由wxCHECK_RET函数触发,验证窗口有效性不通过。但旧版本wxWidgets/wxPython中该代码可正常运行,不清楚原因。
内容的提问来源于stack exchange,提问作者AntumDeluge
相关产品推荐
相关产品推荐

