我在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在上面的代码中完全相同。
答案 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中,此内存仅在焦点更改时回收。我会看看是否可以自动关闭它。
感谢你提出这个问题。