You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级旧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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:39:20