Focusing on a dot can seem non-simple when you are computer code. I made this static `term` class, with methods `clear`, `write_at`, `where`, and `size`: class term: import curses import sys, tty, termios curses.setupterm() _cup = curses.tigetstr('cup') _clear = curses.tigetstr('clear').decode() _csi = '\x1b[' _dsr_cpr = _csi + '6n' @classmethod def clear(cls): x, y = cls.where() print(cls._clear, end='', flush=True) cls.write_at(x, y) @classmethod def write_at(cls, x, y, *text): print(cls.curses.tparm(cls._cup, y, x).decode(), end='') print(*text, end='', flush=True) @classmethod def size(cls): return cls.curses.tigetnum('cols'), cls.curses.tigetnum('rows') @classmethod def where(cls): print(cls._dsr_cpr, end='', flush=True) _, row, col = cls._read_through(cls.sys.stdin, cls._csi, ';', 'R') return int(col) - 1, int(row) - 1 @classmethod def _read_through(cls, file, *delimiters, include=False): fileno = file.fileno() tattr = cls.termios.tcgetattr(fileno) cls.tty.setcbreak(fileno, cls.termios.TCSANOW) try: datas = [] for delimiter in delimiters: data = type(delimiter)() while not data.endswith(delimiter): data += file.read(1) if not include: data = data[:-len(delimiter)] datas.append(data) if len(datas) == 1: return datas[0] else: return datas finally: cls.termios.tcsetattr(fileno, cls.termios.TCSANOW, tattr) Then I can make this small environment class, and have it label a period as I imagined: import time class environment: def make_period_at(self, x, y): term.write_at(x, y, '.') def label_as_period(self, x, y): term.write_at(x + 2, y, '<- this is a period') def wait(self, seconds): time.sleep(seconds) environment = environment() x, y = term.where() term.clear() environment.wait(1) environment.make_period_at(x, y) environment.label_as_period(x, y) environment.wait(4)