solution_055.py

#!/usr/bin/python3
# ===================================================================
# draw a smiley face using curses
# ===================================================================

import curses
from curses import wrapper
import time

face = [ '     ****     ',     # row 0
         '   **    **   ',     # row 1
         ' *          * ',     # row 2
         '*   **  **   *',     # row 3
         '*   **  **   *',     # row 4
         '*            *',     # row 5
         '*   *    *   *',     # row 6
         ' *   ****   * ',     # row 7
         '   *      *   ',     # row 8
         '     ****     ' ]    # row 9

blink3 = '*       **   *'      # blink row 3
blink4 = '*   --  **   *'      # blink row 4

row_offset = 10                # location offset
col_offset = 5                 # location offset

# -------------------------------------------------------------------
# ---- main function
# -------------------------------------------------------------------

def main(stdscr):

    # ---- create color (id,forground,background)

    curses.init_pair(1,curses.COLOR_RED,curses.COLOR_BLACK)
    curses.init_pair(2,curses.COLOR_WHITE,curses.COLOR_BLACK)
    red_black = curses.color_pair(1)
    white_black = curses.color_pair(2)

    # ---- clear screen

    stdscr.clear()

    # ---- draw face

    blink = False
    col   = 0
    loop  = 12
     
    while True:

        # ---- test loop?

        if loop < 0:
            break
        loop -= 1

        # ---- draw face

        for row in range(len(face)):

            rr = row + row_offset
            cc = col + col_offset

            if row == 3 and blink:
                ss = ''.join(f'{c}{c}' for c in blink3)
                stdscr.addstr(rr,cc,ss,white_black)
                continue

            if row == 4 and blink:
                ss = ''.join(f'{c}{c}' for c in blink4)
                stdscr.addstr(rr,cc,ss,white_black)
                continue

            ss = ''.join(f'{c}{c}' for c in face[row])
            stdscr.addstr(rr,cc,ss,white_black)

        # ---- blink next loop?

        blink = not blink

        # ---- refresh screen

        stdscr.refresh()

        # ---- sleep

        time.sleep(0.5)


# -------------------------------------------------------------------
# ---- main - curses wrapper
# -------------------------------------------------------------------

# ---- initialize curses

wrapper(main)