好的,所以我在这里很迷路,任何指导将不胜感激。我有一个程序可以显示给定时间范围内的所有晶圆图。[输入下面的图像]当我输入日期9/1 / 18- 9/15/18时,它的输出很好。当我执行9/15 / 18-9 / 30/18时,它也可以正常工作,但是当我查询整个月时,都会收到错误消息。我开始认为这可能是与内存相关的问题,但是我对内存的了解并不多。我确实知道python本身会处理内存。另外,我确实有16GB的RAM,并且在64位体系结构上工作。该设置是一个GUI,可让您选择一个文件并选择2个日期,然后出现另一个wx.frame,显示晶片图。
查询较大日期时收到以下错误
image = bitmap.ConvertToImage()
wx._core.wxAssertionError: C++ assertion "hbmp" failed at ..\..\src\msw\dib.cpp(139) in wxDIB::Create(): wxDIB::Create(): invalid bitmap
这是从
调用的父函数def SetBitmapLabel(self, bitmap, createOthers=True):
"""
Set the bitmap to display normally.
This is the only one that is required.
If `createOthers` is ``True``, then the other bitmaps will be generated
on the fly. Currently, only the disabled bitmap is generated.
:param wx.Bitmap `bitmap`: the bitmap for the normal button appearance.
.. note:: This is the bitmap used for the unselected state, and for all other
states if no other bitmaps are provided.
"""
self.bmpLabel = bitmap
if bitmap is not None and createOthers:
image = bitmap.ConvertToImage()
imageutils.grayOut(image)
self.SetBitmapDisabled(wx.Bitmap(image))
这是上面的函数称为
的位置def SetBitmap(self, bmp):
"""
Sets the bitmap representation of the current selected colour to the button.
:param wx.Bitmap `bmp`: the new bitmap.
"""
self.SetBitmapLabel(bmp)
self.Refresh()
任何帮助将不胜感激,因为在这一点上,我不知道从这里出发。也许GUI只能在32位上运行?不确定。不知道是否需要该图像,但在下面
编辑 感谢下面的人,我发现发生这种情况的原因是因为脚本的GDI对象达到10,000,这是Windows设置的限制。现在,我必须为此找到解决方法。可能会发布另一个问题以深入探讨
答案 0 :(得分:1)
看起来您可能会用完GDI资源,即创建实际的位图对象(HBITMAP
)失败。不幸的是,在这种情况下,除了显而易见的事情,没有太多的事情可以做:创建更少(和/或更小的)位图。
还要检查是否没有泄漏任何位图,即如果问题仅在运行应用程序一段时间后才开始出现,则可能是这种情况。 Windows下的许多诊断工具(例如Process Explorer)可以向您显示进程消耗的GDI资源,检查程序运行时它们是否没有增长。
答案 1 :(得分:1)
如VZ所说,您似乎耗尽了GDI资源(即位图),这与可用的RAM和操作系统无关。
如果是这种情况,我会走这条路线:
wxImage
转换为bitmap
并将其blit到窗口。位图可以立即发布。答案 2 :(得分:-1)
遇到同样的问题。简单的解决方案可以解决问题:
import subprocess, time
while True:
cd = "py img_get_xp.py"
subprocess.Popen(cd)
time.sleep(600)
subprocess.Popen('tasklist>task.txt', shell=True).communicate()
tasks = open('task.txt')
lines = tasks.read()[::-1]
pos = lines.find("exe.nohtyp")
pid = lines[pos - 22:pos - 18][::-1]
subprocess.call(['taskkill', '/F', '/T', '/PID', pid])