如何修复 wxPython/wxFormBuilder 中出现的 "memory leak of type 'wxPyXmlSubclassFactory *', no destructor found" 错误?

4 投票
2 回答
3063 浏览
提问于 2025-04-17 22:36

我正在尝试按照这个教程,快速使用wxPython和wxFormBuilder制作简单的图形界面(GUI)。

通过wxFormBuilder,我创建了一个超级简单的窗口,里面有一个垂直布局、一个文本输入框和一个按钮,这个按钮的功能只是清空文本框里的内容。wxFormBuilder生成了Python代码,我只是在代码中添加了几行来实现点击按钮时清空文本框的功能。下面是这个简单窗口的图片。

simple frame

当我在Python中运行这个文件时,图形界面确实能清空我在文本框中输入的内容。但是,当我点击窗口的关闭按钮时,我看到这个错误信息:

swig/python detected a memory leak of type 'wxPyXmlSubclassFactory *', no destructor found.

我试着在网上搜索这个问题,但只找到了一些说法,提到Python是动态的,不需要析构函数。我也尝试添加了__del__函数,但仍然出现同样的错误信息。

有没有什么办法可以解决这个错误?我使用的环境是:

  • Python 2.7.6
  • wxPython 3.0.0.0 for Python 2.7
  • wxFormBuilder 3.4.2
  • Windows 7,32位

非常感谢大家的帮助!

如果有人需要,我这里有我的代码:

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Feb 26 2014)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

###########################################################################
## Class MyFrame1
###########################################################################

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 203,155 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.edit = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.edit, 1, wx.ALL|wx.EXPAND, 5 )

        self.clearButton = wx.Button( self, wx.ID_ANY, u"Clear", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.clearButton, 1, wx.ALL|wx.EXPAND, 5 )


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.clearButton.Bind( wx.EVT_BUTTON, self.clearFunc )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def clearFunc( self, event ):
        event.Skip()

class SimpleFrame(MyFrame1):
    def __init__(self,parent):
        MyFrame1.__init__(self,parent)

    def clearFunc(self,event):
        self.edit.SetValue("")

app = wx.App(False)
frame = SimpleFrame(None)
frame.Show(True)
app.MainLoop()

2 个回答

3

根据我了解到的情况,这个wxPython的bug算是比较无害的。不过,听起来作者有一个修复方案,可能已经发布了,也可能还没有:

http://trac.wxwidgets.org/changeset/75542

我对wxPython了解不多,但从版本3.0.0(发布于12月)和我刚刚提到的那个更改(发布于1月)的时间来看,你的版本可能没有包含这个修复。你试过更新wxPython吗?如果你有勇气,最坏的情况是你可以自己尝试做一下链接中的代码更改。祝你好运!

4

我一直在用最新版本(3.0.0),但总是遇到同样的错误。自从那以后也没有发布新版本。不过不用担心,预计很快会有修复的更新。

你可以看看最后一条帖子,在这里

撰写回答