Растровые изображения, использующие все мои объекты GDI wxPython - PullRequest
0 голосов
/ 31 октября 2018

Привет всем, поэтому у меня есть проблема, и я не совсем уверен, как ее решить. У меня есть несколько растровых изображений, которые создаются в зависимости от запроса, проблема здесь в том, что, как только запрос становится немного больше, мое приложение использует все 10 000 объектов GDI, которые разрешены для окон, затем происходит сбой. Я не слишком знаком с ресурсами GDI, но, возможно, есть способ исправить это. Ниже приведены фрагменты кода, который не работает

файл легенды

def _init_ui(self):
    """Initialize UI components."""
    # Add layout management
    self.hbox = wx.BoxSizer(wx.HORIZONTAL)
    self.fgs = wx.FlexGridSizer(rows=self.n_items, cols=2, vgap=0, hgap=0)

    # Create items to add
    for _i, (key, value) in enumerate(zip(self.labels, self.colors)):
        self.label = wx.StaticText(self,
                                   label=str(key),
                                   style=wx.ALIGN_LEFT,
                                   )

        self.colorbox = csel.ColourSelect(self,
                                          _i,
                                          "",
                                          tuple(value),
                                          style=wx.NO_BORDER,
                                          size=(20, 20 ))

        self.Bind(csel.EVT_COLOURSELECT, self.on_color_pick, id=_i)

        self.fgs.Add(self.label, flag=wx.ALIGN_CENTER_VERTICAL)
        self.fgs.Add(self.colorbox)

    # Add our items to the layout manager and set the sizer.
    self.hbox.Add(self.fgs)
    self.SetSizer(self.hbox)

, и это терпит неудачу в размере строки (20,20) этот файл затем вызывает мой файл выбора цвета

def __init__(self, parent, id=wx.ID_ANY, label="", colour=wx.BLACK,
             pos=wx.DefaultPosition, size=wx.DefaultSize,
             callback=None, style=0):


    size = wx.Size(*size)
    if label:
        mdc = wx.MemoryDC(wx.Bitmap(1,1))
        w, h = mdc.GetTextExtent(label)
        w += 8
        h += 8
    else:
        w, h = 22, 22

    size.width = size.width if size.width != -1 else w
    size.height = size.height if size.height != -1 else h
    super(ColourSelect, self).__init__(parent, id, wx.Bitmap(w,h,32),
                             pos=pos, size=size, style=style,
                             name='ColourSelect')

    if type(colour) == type( () ):
        colour = wx.Colour(*colour)

    self.colour = colour
    self.SetLabel(label)
    self.callback = callback
    bmp = self.MakeBitmap()
    self.SetBitmap(bmp)
    self.customColours = None
    parent.Bind(wx.EVT_BUTTON, self.OnClick, self)

сбой при вызове self.SetBipMap (bmp)

, которая вызывает эту маленькую функцию в том же файле

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()

и, наконец, проследить до этой последней функции в моем файле под названием кнопки

def SetBitmapLabel(self, bitmap, createOthers=True):

    self.bmpLabel = bitmap
    if bitmap is not None and createOthers:
        image = bitmap.ConvertToImage()
        imageutils.grayOut(image)
        self.SetBitmapDisabled(wx.Bitmap(image))

и сбой происходит в ** image = bitmap.ConvertToImage () ** если кто-то может предложить какие-либо изменения, чтобы помочь оптимизировать мою программу, я был бы очень признателен. Большая часть кода взята из других библиотек, которые импортируются, поэтому я не очень знаком с ее частями. Надеюсь, у кого-то есть идея

...