Читать книгу «Мастерство терминальных интерфейсов Python: TUI от основ к профессионализму» онлайн полностью📖 — Программист — MyBook.

Глава 5. Работа с текстом: ввод, вывод данных пользователю

Взаимодействие с пользователем – ключевой аспект терминальных приложений. Python предоставляет простые, но мощные инструменты для ввода и вывода текстовой информации. Начнём с базовых механизмов работы с текстом.

**Вывод данных: функция `print()`**

Функция `print()` – основной способ отображения информации. Она преобразует переданные объекты в строки и выводит их в консоль. Пример:

```python

print("Добро пожаловать в приложение!")

```

Вы можете передавать несколько аргументов, разделяемых запятыми. По умолчанию `print()` объединяет их через пробел и добавляет символ переноса строки `\n`. Чтобы изменить разделитель или завершение строки, используйте параметры `sep` и `end`:

```python

print("Файл", "загружен", "успешно", sep="::", end="!\n")

# Результат: "Файл::загружен::успешно!"

```

**Форматирование строк**

Для создания сложных выводов применяйте форматирование:

1. **f-строки** (рекомендуется):

```python

name = "Алиса"

balance = 1200.75

print(f"Пользователь: {name}. Баланс: {balance:.2f} ₽")

# Вывод: "Пользователь: Алиса. Баланс: 1200.75 ₽"

```

2. **Метод `str.format()`**:

```python

print("Сумма: {} из {}".format(5, 10)) # Сумма: 5 из 10

```

3. **Шаблоны % (устаревший способ)**:

```python

print("Отчёт за %s. Ошибок: %d" % ("2024", 0))

```

**Ввод данных: функция `input()`**

Для получения данных от пользователя используйте `input()`. Функция приостанавливает выполнение программы, ожидает ввода с клавиатуры (до нажатия Enter) и возвращает строку:

```python

name = input("Введите ваше имя: ")

print(f"Здравствуйте, {name}!")

```

**Важно:** `input()` всегда возвращает строку. Для преобразования в числа используйте `int()` или `float()`:

```python

try:

age = int(input("Ваш возраст: "))

except ValueError:

print("Ошибка: введите целое число!")

```

**Расширенные возможности вывода**

Для сложных интерфейсов используйте библиотеки, но некоторые эффекты доступны без них:

1. **Многострочный текст**: Тройные кавычки сохраняют переносы:

```python

print("""Первая строка

Вторая строка""")

```

2. **Управление курсором** (ANSI-коды):

```python

print("\033[2J") # Очистка экрана (поддерживается не всеми терминалами)

```

3. **Цветной текст** (через ANSI-коды):

```python

print("\033[31mКрасный текст\033[0m") # \033[0m сбрасывает стиль

```

**Обработка ошибок ввода**

Всегда проверяйте пользовательский ввод на корректность:

```python

while True:

try:

value = float(input("Введите число: "))

break

except ValueError:

print("Ошибка! Введите числовое значение.")

```

**Практические советы**

– Используйте f-строки для читаемости и производительности.

– При запросе конфиденциальных данных (пароли) применяйте модуль `getpass`.

– Для длинных текстов выводите содержимое по частям или с пагинацией.

Эти фундаментальные техники обеспечивают базовое взаимодействие с пользователем. В следующих главах мы расширим их, добавив интерфейсы на базе библиотек, таких как `curses` или `rich`.

Глава 6. Реагирование на команды пользователя в консольных приложениях

Консольные приложения в Python требуют эффективных способов взаимодействия с пользователем. Работа с командами включает обработку аргументов при запуске, создание интерактивных консолей с автодополнением и историей, а также интерпретацию сложных инструкций. Рассмотрим ключевые подходы и инструменты.

## Обработка аргументов командной строки

### Использование `sys.argv`

Для простейших сценариев подходит модуль `sys`:

```python

import sys

if len(sys.argv) > 1:

command = sys.argv[1]

if command == "start":

print("Запуск процесса…")

elif command == "stop":

print("Остановка процесса…")

else:

print("Не указана команда. Допустимые команды: start, stop")

```

### Продвинутая обработка с `argparse`

Для сложных сценариев используйте `argparse`:

```python

import argparse

parser = argparse.ArgumentParser(description="Управление службой")

parser.add_argument("command", choices=["start", "stop", "status"], help="Команда управления")

parser.add_argument("–force", action="store_true", help="Принудительное выполнение")

args = parser.parse_args()

if args.command == "start":

print(f"Служба запущена{' (принудительно)' if args.force else ''}")

elif args.command == "stop":

print(f"Служба остановлена{' (принудительно)' if args.force else ''}")

```

## Интерактивные консольные интерфейсы

### Простой цикл с `input()`

Базовый вариант для построчного ввода:

```python

while True:

user_input = input("> ").strip().lower()

if user_input in ("exit", "quit"):

break

elif user_input == "help":

print("Доступные команды: help, calc, exit")

elif user_input.startswith("calc"):

try:

expr = user_input.split(" ", 1)[1]

result = eval(expr)

print(f"Результат: {result}")

except Exception as e:

print(f"Ошибка: {e}")

```

### Использование `cmd` для структурного проектирования

Модуль `cmd` создает гибкие консольные интерфейсы:

```python

import cmd

class MathConsole(cmd.Cmd):

prompt = "math> "

def do_add(self, arg):

nums = [float(x) for x in arg.split()]

print(f"Сумма: {sum(nums)}")

def do_exit(self, arg):

print("Выход из программы")

return True

if __name__ == "__main__":

MathConsole().cmdloop()

```

## Продвинутые пользовательские интерфейсы с `prompt_toolkit`

Библиотека `prompt_toolkit` предлагает расширенные возможности: автодополнение, подсветку синтаксиса, мультилайн ввод.

Конец ознакомительного фрагмента.