# Python Curses Module

The `curses` module provides an interface to the curses library, the de-facto standard for portable advanced terminal handling. It allows you to create text-based user interfaces (TUI).

*Note: On Windows, the `curses` module is not included in the standard library. You can install it using `pip install windows-curses`.*

## Importing the Module

```python
import curses
```

## Basic Usage

The `curses.wrapper()` function simplifies the initialization and cleanup of curses applications. It handles initializing the library, creating a window, and resetting the terminal state upon exception or exit.

```python
import curses

def main(stdscr):
    # Clear screen
    stdscr.clear()

    # Add text at (0, 0)
    stdscr.addstr(0, 0, "Hello, Curses!")
    
    # Refresh to update the screen
    stdscr.refresh()
    
    # Wait for a key press
    stdscr.getkey()

curses.wrapper(main)
```

## Windows and Pads

### Windows

Windows are the basic abstraction in curses. `stdscr` is the standard screen window. You can create new windows using `curses.newwin(height, width, begin_y, begin_x)`.

```python
import curses

def main(stdscr):
    begin_x = 20; begin_y = 7
    height = 5; width = 40
    win = curses.newwin(height, width, begin_y, begin_x)
    win.addstr(0, 0, "I am a new window")
    win.refresh()
    stdscr.getkey()

curses.wrapper(main)
```

### Pads

Pads are like windows but can be larger than the screen. You display a section of a pad on the screen.

```python
import curses

def main(stdscr):
    pad = curses.newpad(100, 100)
    # Fill the pad
    for y in range(0, 99):
        for x in range(0, 99):
            pad.addch(y, x, ord('a') + (x*x+y*y) % 26)

    # Display a section of the pad
    # refresh(pad_min_y, pad_min_x, screen_min_y, screen_min_x, screen_max_y, screen_max_x)
    pad.refresh(0, 0, 5, 5, 20, 75)
    stdscr.getkey()

curses.wrapper(main)
```

## Colors

To use colors, you must call `curses.start_color()` (handled by `wrapper`). You define color pairs and use them.

```python
import curses

def main(stdscr):
    # Check if color is supported
    if curses.has_colors():
        curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
        
        # Use color pair 1
        stdscr.addstr(0, 0, "Red text on white background", curses.color_pair(1))
        stdscr.refresh()
        stdscr.getkey()

curses.wrapper(main)
```

## User Input

`getch()` returns the integer code of the key pressed. `getkey()` returns the character string.

```python
import curses

def main(stdscr):
    stdscr.addstr("Press 'q' to quit\n")
    while True:
        key = stdscr.getkey()
        stdscr.addstr(f"Key pressed: {key}\n")
        if key == 'q':
            break

curses.wrapper(main)
```

## Attributes

You can display text with attributes like bold, underline, etc.

```python
stdscr.addstr(0, 0, "Bold Text", curses.A_BOLD)
stdscr.addstr(1, 0, "Underlined Text", curses.A_UNDERLINE)
```

[[programming/python/python]]