问题显示多个图像wx.python

时间:2018-10-30 15:50:11

标签: python python-3.x memory-management wxpython wxwidgets

好的,所以我在这里很迷路,任何指导将不胜感激。我有一个程序可以显示给定时间范围内的所有晶圆图。[输入下面的图像]当我输入日期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位上运行?不确定。不知道是否需要该图像,但在下面  wafer maps

编辑 感谢下面的人,我发现发生这种情况的原因是因为脚本的GDI对象达到10,000,这是Windows设置的限制。现在,我必须为此找到解决方法。可能会发布另一个问题以深入探讨

3 个答案:

答案 0 :(得分:1)

看起来您可能会用完GDI资源,即创建实际的位图对象(HBITMAP)失败。不幸的是,在这种情况下,除了显而易见的事情,没有太多的事情可以做:创建更少(和/或更小的)位图。

还要检查是否没有泄漏任何位图,即如果问题仅在运行应用程序一段时间后才开始出现,则可能是这种情况。 Windows下的许多诊断工具(例如Process Explorer)可以向您显示进程消耗的GDI资源,检查程序运行时它们是否没有增长。

答案 1 :(得分:1)

如VZ所说,您似乎耗尽了GDI资源(即位图),这与可用的RAM和操作系统无关。

如果是这种情况,我会走这条路线:

  • 将图像存储在wxImage的对象中。他们将使用RAM,但不会使用GDI资源。
  • 处理每个窗口绘制事件。在此处理程序中,将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])