wxPython内存泄漏与设置值
我在Mac OS X 10.6.8、wxPython 2.9.3.1和64位Python v2.7.2下运行以下代码: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,
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时间来做清理工作。因此,一种手动操作的方法将是非常好的。