Я пытаюсь создать wx.Frame с переменной прозрачностью (на основе png, отображенного в событии стирания bk)

Я пытаюсь сделать специальный экран-заставку, который отображается во время загрузки приложения, выводит сообщения о загрузке различных компонентов и имеет индикатор выполнения.

Первая задача, которую я решаю, — это сопоставление изображения .png с фреймом, в котором будет размещаться экран-заставка.

import wx

class edSplash(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, size=(410, 410), style=wx.NO_BORDER)
        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.Center()
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
        return

    def OnEraseBackground(self, evt):
        dc = evt.GetDC() 
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)

        tempBrush = wx.Brush((0,0,0,0),wx.TRANSPARENT)
        print tempBrush
        dc.SetBackground(tempBrush)
        dc.SetBackgroundMode(wx.TRANSPARENT)
        #dc.Clear()
        img = wx.Image("splash.png", wx.BITMAP_TYPE_PNG, -1)
        bmp = wx.BitmapFromImage(img)
        dc.DrawBitmap(bmp, 0, 0, True)

    def PushMessage(self, mesage):
        print mesage


class edApp(wx.App):
    def OnInit(self):
        splash = edSplash(None, 'Ed')
        self.SetTopWindow(splash)
        splash.Show(True)
        return True

if __name__ == '__main__':
    edApp(redirect=False).MainLoop()

Проблема в том, что dc.Clear() очищает до непрозрачного прямоугольника, хотя я установил его кисть и режим прозрачным (я думаю: D). Комментирование dc.Clear() дает мне желаемую переменную прозрачность на основе альфа-канала .png, но окно собирает шум изображения из соседних окон.

Как я могу получить как прозрачность .png, так и очистить фон до прозрачной кисти, чтобы не собирать шум изображения?


person Paul    schedule 27.07.2010    source источник


Ответы (1)


Возможно, вам стоит попробовать поместить фоновое изображение на панель, а не на рамку. Вот один из способов сделать это:

http://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/

person Mike Driscoll    schedule 27.07.2010