Вы сказали, что используете ctypes, потому что для этого вам нужен изменяемый буфер символов. Но вы можете получить желаемый результат из списка понимания
num_chars = 5
num_rows = 8
empty = ['.' * num_chars]
full = ['*' * num_chars]
print '\n'.join(
'|'.join(empty * (i + 1) + (num_rows - i - 1) * full)
for i in xrange(num_rows)
)
.....|*****|*****|*****|*****|*****|*****|*****
.....|.....|*****|*****|*****|*****|*****|*****
.....|.....|.....|*****|*****|*****|*****|*****
.....|.....|.....|.....|*****|*****|*****|*****
.....|.....|.....|.....|.....|*****|*****|*****
.....|.....|.....|.....|.....|.....|*****|*****
.....|.....|.....|.....|.....|.....|.....|*****
.....|.....|.....|.....|.....|.....|.....|.....
EDIT
Я покажу вам, как вы можете использовать списки для рисования любого растрового изображения, которое хотите нарисовать Идея проста. Создайте логический массив с True в тех местах, где вы хотите напечатать символ, и False в противном случае. И просто используйте трюк "или", чтобы напечатать правильный символ. Этот пример создаст шахматную доску. Вы можете использовать ту же концепцию, чтобы нарисовать любую фигуру.
rows = 5
cols = 6
char = '#'
empty = '.'
bitmap = [[ (i + j)%2 == 0 for i in xrange(cols)] for j in xrange(rows)]
print '\n'.join(
'|'.join(bitmap[j][i] * char or empty for i in xrange(cols))
for j in xrange(rows)
)