проблема с отображением нескольких изображений wx.python - PullRequest
0 голосов
/ 30 октября 2018

Хорошо, так что я серьезно заблудился здесь, и любые указания будут оценены. У меня есть программа, которая отображает все вафельные карты в заданном временном диапазоне. [Изображение показано ниже], когда я ввожу даты 9/1 / 18-9/15/18, он выводит нормально. Когда я делаю 9/15 / 18-9 / 30/18, это также работает нормально, но когда я запрашиваю весь месяц, я получаю ошибку. Я начинаю думать, что это может быть связано с памятью, но я не слишком осведомлен о памяти. Я знаю, что Python обрабатывает память сам по себе. Также у меня есть 16 ГБ оперативной памяти и работа на 64-битной архитектуре. Настройка представляет собой графический интерфейс, который позволяет вам выбрать файл и выбрать 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()

любая помощь будет принята с благодарностью, потому что на данный момент я понятия не имею, куда идти дальше. Может быть, графический пользовательский интерфейс работает только на 32-битной? Точно сказать не могу. Не уверен, если изображение необходимо, но здесь ниже wafer maps

EDIT Благодаря парням ниже я обнаружил, что причина этого заключается в том, что мои объекты GDI достигают 10000 для сценария, что является ограничением, установленным окнами. Теперь я должен найти способ обойти это. Вероятно, опубликует еще один вопрос, чтобы погрузиться в это

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Как сказал VZ, похоже, что у вас заканчиваются ресурсы GDI (т.е. битмап), которые не имеют ничего общего с доступной оперативной памятью, но с ОС.

Если это так, я бы пошел по этому пути:

  • Храните ваши изображения в объектах wxImage. Они будут использовать оперативную память, но не ресурсы GDI.
  • Обработка каждого события рисования окна. В этом обработчике преобразуйте wxImage в bitmap и добавьте его в окно. Растровое изображение может быть выпущено сейчас.
0 голосов
/ 20 мая 2019

Встреча с той же проблемой. Простое решение решает проблему:

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])
0 голосов
/ 30 октября 2018

Похоже, что у вас не хватает ресурсов GDI, то есть создание реального объекта растрового изображения (HBITMAP) завершается неудачно. К сожалению, в этом случае можно сделать не так уж много, кроме очевидного: создать меньше (и / или меньших) растровых изображений.

Также убедитесь, что вы не пропускаете никаких растровых изображений, т. Е. Если проблема начинает появляться только после того, как вы запустили приложение в течение некоторого времени, это вполне может иметь место. Многие инструменты диагностики в Windows (например, Process Explorer ) могут показывать вам ресурсы GDI, потребляемые вашим процессом, проверьте, не растут ли они во время работы программы.

...