wxpython alpha colors overwrite previous drawing

65 views Asked by At

I create a new bitmap on each frame so that everything draws on a new canvas but apparently something else is going on, each frame seems to be drawing on top of the previous, is there something I have to modify in this code:

import wx

class MyPanel(wx.Window):
    def __init__(self, parent, *args, **kwargs):
        wx.Window.__init__(self)
        self.SetBackgroundStyle(wx.BG_STYLE_TRANSPARENT)
        self.Create(parent, style=wx.TRANSPARENT_WINDOW, *args, **kwargs)
        
        self.SetBackgroundColour(wx.TransparentColour)
        # ~ self.SetBackgroundColour((200,100,100,10))
        self.SetTransparent(0)

        self.Bind(wx.EVT_PAINT, self.OnPaint, self)
        self.Bind(wx.EVT_ERASE_BACKGROUND, lambda ev: None)
        self.timer = wx.Timer(self)
        self.timer.Start(20, oneShot=False)
        self.Bind(wx.EVT_TIMER, lambda ev: self.Refresh(eraseBackground=True), self.timer)
        self.bmp = wx.Bitmap.FromRGBA(*self.GetSize(), 0,0,0,wx.ALPHA_TRANSPARENT)

    def OnPaint(self, event):
        print("painting")
        self.bmp = wx.Bitmap.FromRGBA(*self.GetSize(), 0,0,0,wx.ALPHA_TRANSPARENT)
        dc = wx.BufferedDC(wx.ClientDC(self), self.bmp)
        # ~ dc = wx.BufferedPaintDC(self, self.bmp)
        # ~ dc = wx.PaintDC(self)
        dc.SetBackgroundMode(wx.TRANSPARENT)
        dc.SetBackground(wx.TRANSPARENT_BRUSH)
        dc.Clear()  #This should be clearing the drawing!
        
        
        gc = wx.GCDC(dc)
        
        gc.SetBrush(wx.Brush((255,255,0,10)))
        gc.DrawRectangle(0,0,*dc.GetSize())

        gc.SetBrush(wx.Brush((255,255,0,55)))
        gc.DrawRectangle(100,100,100,100)
        gc.DrawText("square", 200,100)

        gc.SetBrush(wx.Brush((0, 255, 255, 55)))
        gc.DrawRectangle(100,300,100,100)
        gc.DrawText("square", 200,300)


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        panel = MyPanel(self)
        button1 = wx.Button(panel, label="button")


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, title="Frame", size=(400, 800))
        frame.SetBackgroundColour("blue")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True

app = MyApp()
app.MainLoop()
0

There are 0 answers