the barcode object has an xo offset which is 18 by default. Try
def demo(canvas, x, y, text):
c = canvas
bc = Code128(text)
bc.xo = 0
bc.drawOn(c, x, y)
t = c.beginText(x,y-10)
t.setFont('Helvetica',6)
t.textOut(text)
c.drawText(t)
draw_grid(c, x, y)
--
Robin Becker