Search code examples
pythonuser-interfacewxpython

wxPython - Drawing an unfilled rectangle with the DC


dc.SetPen(wx.Pen(wx.BLACK, 0))
dc.SetBrush(wx.Brush("C0C0C0"))
dc.DrawRectangle(50,50,50,50)

This is my best attempt at drawing a 50x50, gray box with no border. However, setting the pen width to 0 doesn't seem to accomplish anything, and setting the brush only changes the fill from pure white to pure black.

Here's it in the context of a panel, in case it's part of the problem:

class DrawRect(wx.Panel):
     def __init__(self,parent=None,id=-1,pos=(-1,-1),size=(-1,-1),style=0):
         wx.Panel.__init__(self,parent,id,size,pos,style)
         self.SetBackgroundColour("#D18B47")
         self.Bind(wx.EVT_PAINT,self.onPaint)

     def onPaint(self, event):
         event.Skip()
         dc = wx.PaintDC(event.GetEventObject())
         self.drawRect(dc)

     def drawRect(self,dc):
         dc.SetPen(wx.Pen("FFCE8A", 0))
         dc.SetBrush(wx.Brush("C0C0C0"))
         dc.DrawRectangle(50,50,50,50)

Solution

  • This makes a grey rectangle:

    import wx
    
    class MyPanel(wx.Panel):
        """ class MyPanel creates a panel to draw on, inherits wx.Panel """
        def __init__(self, parent, id):
            # create a panel
            wx.Panel.__init__(self, parent, id)
            self.SetBackgroundColour("white")
            self.Bind(wx.EVT_PAINT, self.OnPaint)
    
        def OnPaint(self, evt):
            """set up the device context (DC) for painting"""
            self.dc = wx.PaintDC(self)
            self.dc.BeginDrawing()
            self.dc.SetPen(wx.Pen("grey",style=wx.TRANSPARENT))
            self.dc.SetBrush(wx.Brush("grey", wx.SOLID))
            # set x, y, w, h for rectangle
            self.dc.DrawRectangle(250,250,50, 50)
            self.dc.EndDrawing()
            del self.dc
    
    app = wx.PySimpleApp()
    # create a window/frame, no parent, -1 is default ID
    frame = wx.Frame(None, -1, "Drawing A Rectangle...", size = (500, 500))
    # call the derived class, -1 is default ID
    MyPanel(frame,-1)
    # show the frame
    frame.Show(True)
    # start the event loop
    app.MainLoop()