wxPython内存泄漏与setValue

时间:2012-07-19 15:26:47

标签: wxpython

我在Mac OS X 10.6.8,wxPython 2.9.3.1和64 Bit 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在上面的代码中完全相同。

3 个答案:

答案 0 :(得分:4)

Mike的回答至少是部分正确的,如果可以的话,最好避免使用wx.Yield。切换到使用EVT_IDLE事件后,仍然会出现明显的内存泄漏,尽管它比以前小得多且速度慢。切换到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()

答案 1 :(得分:1)

我怀疑你经常调用wx.Yield并且事件正在堆积。我怀疑你的GUI也很敏感。更好的方法是使用wx.Timer并定期更新标签。您必须在wxPython邮件列表上询问才能获得真正的技术答案。

答案 2 :(得分:1)

OSX具有自动释放池的概念,即许多OS'临时'对象仅在通过事件循环迭代后被清除,您的紧密循环永远不会给操作系统清除任何东西的机会,调用yield对此没有帮助。 / p>

使用textctrl时Robin空闲实现中内存消耗的原因是 - 只要文本字段具有焦点 - 它将所有内容存储在其undo-stack中,此内存仅在焦点更改时回收。我会看看是否可以自动关闭它。

感谢你提出这个问题。