Files
knowledge_vault/Языки программирования/Curses - оконные объекты.md
2025-12-19 13:47:54 +05:00

113 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
В [[Curses]], существуют объекты, сразными параметрами, для разметки и ореинтации в консоли.
Ранее добавленный объект `stdscr`, является по сути объектом окна нашей консоли.
### Управление выводом текста
- `addch(y, x, ch[, attr])` – вывести символ.
- `addstr(y, x, str[, attr])` – вывести строку.
- `insstr([y, x,] str[, attr])` – вставить строку.
- `delch([y, x])` – удалить символ.
### Управление положением курсора
- `move(y, x)` – переместить курсор.
- `getyx()` – получить текущие координаты курсора.
- `getbegyx()` – координаты верхнего-левого угла окна.
- `getmyx()` – размеры окна (строки, колонки).
### Чтение ввода
- `getch([y, x])` – получить символ/код клавиши.
- `getkey([y, x])` – то же, но как строка (например `"KEY_LEFT"`).
- `getstr([y, x])` – считать строку.
- `nodelay(flag)` – включить/выключить неблокирующий ввод.
- `timeout(ms)` – задать таймаут ожидания ввода.
-
### Работа с экраном/окном
- `clear()` – очистить окно.
- `erase()` – стереть содержимое (похоже на `clear`, но без обновления).
- `refresh()` – обновить экран, показать изменения.
- `noutrefresh()` – отложенное обновление (для `doupdate()`).
- `redrawwin()` – перерисовать окно.
### Атрибуты и цвет
- `attron(attr)` – включить атрибут.
- `attroff(attr)` – выключить атрибут.
- `attrset(attr)` – установить атрибуты.
- `bkgd(ch[, attr])` – задать символ/атрибут фона.
- `bkgdset(ch[, attr])` – задать "фон по умолчанию".
- `color_pair(n)` – использовать цветовую пару.
### Управление окнами
- `subwin(nlines, ncols, begin_y, begin_x)` – создать подокно.
- `derwin(nlines, ncols, begin_y, begin_x)` – "деривативное" окно.
- `overlay(win)` – скопировать содержимое (не заменяя пробелы).
- `overwrite(win)` – полностью переписать.
- `box([vertch, horch])` – нарисовать рамку вокруг окна.
- `border([...])` – нарисовать рамку со своими символами.
### Прокрутка
- `scroll([n])` – прокрутить содержимое вверх.
- `scrollok(flag)` – разрешить/запретить автопрокрутку.
### Дополнительно
- `keypad(flag)` – включить/выключить поддержку функциональных клавиш.
- `idlok(flag)` – оптимизировать обновление при вставке/удалении строк.
- `leaveok(flag)` – разрешить оставлять курсор "где попало".
- `touchwin()` – пометить всё окно для перерисовки.
- `untouchwin()` – снять метки.
- `is_wintouched()` – проверить, есть ли изменения.
### Обьекты окон
В curses так же можно создавать окна отдельно от основного.
Вот несколько обьектов окон для разметки в curses:
#### newwin - обычное окно
- Создаётся функцией `curses.newwin(nlines, ncols, begin_y, begin_x)`.
- Можно сделать несколько таких окон в пределах `stdscr`.
- Каждый объект — независимый `_curses.window`.
Пример:
```python
win = curses.newwin()
```
#### subwin - подокно
- Создаётся как "срез" другого окна.
- Разделяет память с родительским окном: изменения в одном видны в другом.
- Удобно, если хочешь "разбить экран на части".
Пример:
```python
sub = stdscr.subwin(5, 20, 2, 5)
```
#### derwin - Дочернее окно
- Похоже на subwin, но привязано к координатам внутри родительского окна, а не всего экрана.
- Тоже разделяет буфер с родителем.
Пример:
```python
der = win.derwin(5, 20, 1, 1)
```
### newpad - Pad
- "Большое окно", которое может быть больше экрана.
- Сам не отображается, нужно явно указывать какую часть показывать через pad.refresh().
- Удобно для скроллинга длинных текстов, логов и т. п.
Пример:
```python
pad = curses.newpad(100, 100)
pad.refresh(pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
```
где
- **`pminrow, pmincol`** — координаты внутри pad (откуда брать данные).
- **`sminrow, smincol`** — верхний левый угол области на экране, куда будет выведен кусок pad.
- **`smaxrow, smaxcol`** — нижний правый угол области на экране (включительно).