wxPython内存泄漏与设置值

wxPython内存泄漏与设置值,wxpython,Wxpython,我在Mac OS X 10.6.8、wxPython 2.9.3.1和64位Python v2.7.2下运行以下代码: import wx class MyFrame(wx.Frame): def __init__(self): super(MyFrame,self).__init__(None, title="Frame", size=(100, 100)) self.field = wx.TextCtrl(self, -1, "Text", (30,

我在Mac OS X 10.6.8、wxPython 2.9.3.1和64位Python v2.7.2下运行以下代码:

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super(MyFrame,self).__init__(None, title="Frame", size=(100, 100))
        self.field = wx.TextCtrl(self, -1, "Text", (30, 7))
    def startLoop(self):
        counter = 0
        while True:
            counter += 1
            self.field.SetValue(str(counter))
            wx.Yield()
class Main(wx.App):
    def __init__(self):
        self.counter = 0
        super(Main,self).__init__(0)

    def OnInit(self):
        self.frame = MyFrame()
        self.frame.Show()
        self.frame.startLoop()
        self.MainLoop()
        return True
Main()
它只会消耗更多的内存。我是做错了什么,还是wxPython坏得太厉害了?最重要的是有一个解决办法,因为我已经基于wxPython编程了一个巨大的GUI

非常感谢你


上述代码中的wx.StaticText泄漏完全相同。

我怀疑您调用wx.Yield的频率太高,并且事件正在累积。我怀疑你的图形用户界面是否反应灵敏。更好的方法是使用wx.Timer并让它定期更新标签。你必须在wxPython邮件列表上询问,才能得到真正的技术性答案。

迈克的答案至少部分正确,如果可以的话,最好避免wx.Yield。在切换到使用EVT_空闲事件之后,仍然存在明显的内存泄漏,尽管它比以前小得多,速度也慢得多。切换到wx.StaticText而不是wx.TextCtrl显示根本没有泄漏,因此似乎确实存在与wx.TextCtrl.SetValue相关的问题。请在trac.wxwidgets.org上对此制作一张票据,组件设置为wxOSX cocoa,并包含指向此页面的链接

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super(MyFrame,self).__init__(None, title="Frame", size=(100, 100))
        ##self.field = wx.TextCtrl(self, -1, "Text", (30, 7))
        self.field = wx.StaticText(self)

    def startIdle(self):
        self.counter = 0
        self.Bind(wx.EVT_IDLE, self.onIdle)

    def onIdle(self, evt):
        self.counter += 1
        ##self.field.SetValue(str(self.counter))
        self.field.SetLabel(str(self.counter))
        evt.RequestMore()


class Main(wx.App):
    def OnInit(self):
        self.frame = MyFrame()
        self.frame.Show()
        self.frame.startIdle()
        self.MainLoop()
        return True
Main()

OSX有自动释放池的概念,即许多操作系统的“临时”对象只有在通过事件循环进行迭代后才能被清除,你的紧密循环从来没有给操作系统清除任何东西的机会,在这里调用yield没有帮助

使用textctrl时,Robin的空闲实现中内存消耗的原因是,只要textfield具有焦点,它就会将所有内容存储在其撤消堆栈中,只有当焦点改变时,才会回收该内存。我看看是否能自动关闭这个


感谢您提出这个问题。

可能是特定于实现的,我已经完成了3百万次迭代,python的内存也没有超过原来的2600万。Win7、python32 2.2.7、wxpython 2.8.12.1有趣。它在半分钟后超过100 MB,并在我的计算机上不断增长。也许可以尝试测试Mike Driscoll的理论,或者删除wx.Yield(),或者每千次/百万次迭代一次,看看它是否会影响增长?不管怎样,我同意这是出乎意料的&你可能不得不去wxpython列表寻求解释。谢谢!我以前在GUI中使用过wx.StaticText(不在示例中),漏洞更大。我一到办公室就会测试你的解决方案。在我的实际代码中,我在等待线程的循环中使用join(1)每秒更新一次GUI。但由于程序运行了很长时间,这就成了一个问题。现在我切换回StaticText,并使用计时器每秒更新一次GUI,但它仍然泄漏。但可能是进度条什么的。还有其他函数更像Layout()。我无法理解这是如何通过bug测试的。我的意思是它破坏了OSX上的整个wx.Python。我已经为svn主干添加了一个修复程序,它关闭了setter的undo,好的,非常感谢!我能够通过使用不经常更新的计时器和StaticText而不是CtrlText来解决这个bug。问题是,我的应用程序在多个线程中非常cpu密集。这可能让wx没有太多的cpu时间来做清理工作。因此,一种手动操作的方法将是非常好的。