我试图制作一个具有可变透明度的wx.Frame(基于擦除背景事件中的png映射)

3 投票
1 回答
538 浏览
提问于 2025-04-16 01:53

我正在尝试制作一个特别的启动画面,这个画面会在应用程序加载时显示,期间会输出各种组件加载的信息,并且有一个进度条。

我现在要做的第一件事是把一个 .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/

撰写回答