Curses: создаем отрисовщик статистики, менеджерим ресурсы и играем в змейку
Обсуждаем библиотеку Curses для Python. Рассказываем, почему легче использовать её, чем создавать под задачи отдельное графическое приложение.
5К открытий10К показов
Всем добрый день, сегодня мы обсудим библиотеку Curses. И узнаем, почему легче использовать ее, чем создавать под задачи отдельное графическое приложение.
Автор статьи — Александр Ватолин, геймдизайнер и преподаватель в Московской школе программистов (МШП).
Представим ситуацию: вам нужно реализовать простенькую программу, которая способна выводить данные из под какого-то сервера или собирать информацию. Делать под эти задачи полноценное графическое приложение явно не лучший вариант. Причина простая: это долго и требует умения работы с графическими библиотеками.
Тут и приходит на выручку старый добрый консольный вывод. Только вот стандартная консоль не предоставляет большого выбора в плане работы. Поэтому можем использовать Curses — простое решение для быстрых задач.
А еще такая система позволит создавать кастомные и удобные приложения на вашем сервере, где консоль единственный интерфейс для общения.
Начнем с установки. Она стандартная и требует pip. Если вы работаете на Windows, то воспользуйтесь данной командой:
Библиотека установлена, что теперь? Давайте для начала сделаем простое окно. Для этого мы подключим библиотеку при помощи команды import curses.
Чтобы подключиться к консоли, воспользуемся методом iniscr, который создаст окно консоли. Учитывайте, на MACOS\Linux будет использована другая команда – newwin, но в остальном отличий нету.
Для добавления строчек в консоль используется метод addstr, где первые два аргумента отвечают координатам текста, а третий самому тексту.
Также для вывода одиночного символа подойдет метод addch.
Метод refresh позволяет обновить экран, отрендерить собранные нами строчки. То есть, пока мы не произведем данный метод, в консоли ничего не отобразится.
Метод napms представляет из себя задержку, которую можно использовать для пауз в работе. Для закрытия окна используется endwin – метод един для всех систем.
Хм, вы скажете – но это же выглядит сейчас не более, чем блокнот. Да, но у него уже можно найти свою пользу. Уже можно выводить различные полезные данные.
А что насчет более удобной работы с текстом? У Сurses есть все возможности поспорить с вашим текстовым редактором. Рассмотрим часть его способностей!
Начнем с базовых функций любого редактора. Внутрь метода addstr можно передавать тип введенных данных. Он передается после самого текста опционально. Какие есть варианты?
- curses.A_BOLD – жирный текст
- curses.A_STANDOUT – Выделенный текст
- curses.A_UNDERLINE – Подчеркнутый текст
- Для обычного текста ничего передавать не нужно.
Для работы с цветом используется метод init_pair, который создает пару цветов под определенным номером. Метод получает три параметра:
- Номер, id. Может нести значение от 1 до 255. Будет использоваться далее
- Цвет текста. Обращение к цветам через curses.COLOR_*
- Цвет фона
Для применения цветов в методе выводы текста addstr после текста добавляется модификатор цветовой пары: curses.color_pair(id). Также можно передавать несколько модификаторов при помощи оператора, перечисляя их.
Внимание на пример ниже!
Результат работы этого кода:
Хорошо, для вывода статистики это уже неплохо. Но как же обработка нажатий? Тут все для этого есть.
Для перехвата нажатий клавиш можно использовать метод getch. Он позволяет получить юникод символа, нажатого на клавиатуре. Его можно использовать для ввода, а можно использовать просто как метод для выхода по любой кнопке.
Печатать в обыкновенную консоль после закрытия консоли curses можно при помощи старого доброго print.
Что получится в результате:
К слову, у Curses есть wrapper. Поясню, зачем он нужен. К примеру, наша программа схватила исключение и изменила каким-то образом работу базовой консоли. Враппер позволяет сделать отдельный поток, который в случае неожиданного закрытия не создаст каких-либо проблем для основной оболочки. На самом деле это не все плюсы враппера, но в данным момент их достаточно. Для их использования надо подключить враппер к вашей основной функции по принципу wrapper(func).
Пользоваться им проще простого, достаточно построить такую структуру:
Вы все еще думаете, что эта библиотека ничего не может? Хорошо, давайте сыграем прямо в консоли в змейку!
Ну и чтобы вы мне поверили, что уже известных методов нам достаточно, покажу, как эту змейку сделать.
Сразу уточню, что алгоритм работы змейки не является целью этой статьи. Поэтому, если вы не до конца понимаете, как она работает, можете спокойно изучить любую другую тематическую статью.
Расскажу о ней в контексте curses. При работе с экраном можно легко нарисовать границы, отключить поддержку клавиатуры и подобное с помощью соответствующих методов. Также есть еще один метод паузы, которым мы укажем скорость работы змейки. Это метод timeout, который укажет, насколько часто должен обновляться экран консоли. Также напоминаю о методе addch, который выводит не строку, а лишь один символ. Его мы разбирали в самом начале.
Подведем небольшие итоги: перед нами очень узкоспециальная библиотека, которая дает нам неограниченную мощь при работе с консолью. Мы можем создать отрисовщик статистики, менеджер ресурсов компьютера, да и в целом реализовать абсолютно любую идею. Даже в игры здесь можно играть.
Я, например, установил себе исполнитель, который при долгом отсутствии у компьютера выводит текущее время в милом ASC-II формате.
Вот такая простая библиотека с таким широким простором для творчества. Только название у нее пугающее, в переводе “проклятие”. Но об этом поговорим в следующий раз..
5К открытий10К показов