Почему бы вам просто не нарисовать фигуру поверх изображения, а не за ней?
Итак, вместо того, чтобы сначала нарисовать фигуру, а затем нарисовать изображение, сделайте все наоборот. Сначала нарисуйте изображение, а затем форму.
def on_draw(self, wid, cr):
self.pb = GdkPixbuf.Pixbuf.new_from_file_at_scale("image2.jpg", 1920, 1080, True)
Gdk.cairo_set_source_pixbuf(cr, self.pb, 0, 0)
cr.paint()
cr.set_source_rgb(0, 0, 0)
cr.rectangle(1500, 300, 400, 800)
cr.stroke()