Я пытаюсь сделать wx.Frame с переменной прозрачностью (на основе png, отображенного в событии erase bk) - PullRequest
3 голосов
/ 27 июля 2010

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

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

import wx</p> <pre><code>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 и иметь фоночистить прозрачную кисть, чтобы избежать шума изображения?

1 Ответ

1 голос
/ 27 июля 2010

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

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

...