我试图制作一个具有可变透明度的wx.Frame(基于擦除背景事件中的png映射)
我正在尝试制作一个特别的启动画面,这个画面会在应用程序加载时显示,期间会输出各种组件加载的信息,并且有一个进度条。
我现在要做的第一件事是把一个 .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 图片的透明效果,并且让背景清除成透明的画刷,以避免收集到图像噪点呢?
1 个回答
1
也许你可以试着把背景图片放在一个面板上,而不是直接放在框架里。这里有一种方法可以做到:
http://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/