在Python和wxPython中避免不必要的内存消耗

时间:2014-03-20 13:13:18

标签: python python-2.7 memory memory-management wxpython

我在Windows 7操作系统上使用python v2.7和wxPython v3.0。在我的应用程序中,我有一个名为myPanel的面板。我在myPanel上有一个图片作为背景,图片名称为green.bmp myPanel包含一个名为myButton的按钮。此myButton还包含一个名为blue.bmp的背景图片。该主题只会更改myButton上的图片。

出于演示目的,我在myButton上反复使用相同的图像。在我的现实世界问题中,我有不同的图像。

问题:执行我的应用程序后,当我看到任务管理器中的内存消耗时,我发现内存消耗不断增加。我的代码有什么问题导致不必要的内存消耗?我怎么能避免这个?

代码:代码中使用的图片可以从Green.bmpBlue.bmp下载。代码段如下:

import wx
from wx.lib.pubsub import setupkwargs
from wx.lib.pubsub import pub
from threading import Thread
import threading
import time

class gui(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, None, id, title, size=(500,400))
        myPanel = wx.Panel(self, -1, size=(300,200))
        image_file1 = 'green.bmp'
        image1 = wx.Image(image_file1, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.bitmap2 = wx.StaticBitmap(myPanel, -1, image1, (0, 0))
        pub.subscribe(self.addImage, 'Update')

    def addImage(self):
        myButton = wx.Button(self.bitmap2, -1, size =(30,30), pos=(20,20))
        image_file2 = 'blue.bmp'
        image2 = wx.Image(image_file2, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.bitmap1 = wx.StaticBitmap(myButton, -1, image2, (0, 0))

class myThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.start()
    def run(self):
        while True:
            time.sleep(2)
            wx.CallAfter(pub.sendMessage, 'Update')

if __name__=='__main__':
    app = wx.App()
    frame = gui(parent=None, id=-1, title="Test")
    frame.Show()
    myThread()
    app.MainLoop()

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您的问题出在addImage中。每次执行此行:

myButton = wx.Button(self.bitmap2, -1, size =(30,30), pos=(20,20))

您正在向self.bitmap2添加另一个子窗口。窗口与之前添加的窗口完全重叠,因此您不会有多个孩子。要查看发生的情况,请将此行添加到addImage的底部:

print len(self.bitmap2.GetChildren())

要解决此问题,您应该在添加新按钮之前销毁所有子项。将其添加到addImage的顶部

self.bitmap2.DestroyChildren()

但是,这种方法会破坏你添加到bitmap2的 ALL 窗口,所以要轻视。如果你只想破坏按钮,你应该保留它的引用。我已修改您的程序以使用此方法:

import wx
from wx.lib.pubsub import setupkwargs
from wx.lib.pubsub import pub
from threading import Thread
import threading
import time

class gui(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, None, id, title, size=(500,400))
        myPanel = wx.Panel(self, -1, size=(300,200))
        image1 = wx.Image('green.bmp', wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.bitmap2 = wx.StaticBitmap(myPanel, -1, image1, (0, 0))
        pub.subscribe(self.addImage, 'Update')
        self.myButton = None

    def addImage(self):
        # Don't keep adding children to bitmap2
        if self.myButton:
            self.myButton.Destroy()
        self.myButton = wx.Button(self.bitmap2, -1, size =(30,30), pos=(20,20))
        image2 = wx.Image('blue.bmp', wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.bitmap1 = wx.StaticBitmap(self.myButton, -1, image2, (0, 0))


class myThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.start()
    def run(self):
        while True:
            time.sleep(2)
            wx.CallAfter(pub.sendMessage, 'Update')

if __name__=='__main__':
    app = wx.App()
    frame = gui(parent=None, id=-1, title="Test")
    frame.Show()
    myThread()
    app.MainLoop()