我在Windows 7操作系统上使用python v2.7和wxPython v3.0。在我的应用程序中,我有一个名为myPanel
的面板。我在myPanel
上有一个图片作为背景,图片名称为green.bmp
myPanel
包含一个名为myButton
的按钮。此myButton
还包含一个名为blue.bmp
的背景图片。该主题只会更改myButton
上的图片。
出于演示目的,我在myButton
上反复使用相同的图像。在我的现实世界问题中,我有不同的图像。
问题:执行我的应用程序后,当我看到任务管理器中的内存消耗时,我发现内存消耗不断增加。我的代码有什么问题导致不必要的内存消耗?我怎么能避免这个?
代码:代码中使用的图片可以从Green.bmp和Blue.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()
感谢您的时间。
答案 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()