БэкендPython

Как создать QR-код на Python: текст, ссылка, цвета и проверка

Генерируем QR-код на Python с библиотекой qrcode: сохраняем PNG, настраиваем размер и цвета, проверяем чтение и не ломаем обязательную тихую зону.

Кодик

Автор

5 мин чтения

Рабочий QR-код на Python можно сохранить в PNG за несколько строк, но его ещё нужно проверить камерой. Вы установите qrcode, закодируете ссылку, сохраните изображение и разберётесь, почему поля и контраст важнее декоративного градиента.

QR-код не является короткой ссылкой. Он хранит переданную строку прямо в рисунке. Чем длиннее данные, тем плотнее сетка и сложнее чтение. Поэтому для первого проекта возьмём короткий HTTPS-адрес и стандартные чёрно-белые цвета.

1Устанавливаем

Берём пакет qrcode с поддержкой Pillow.

2Создаём

Добавляем строку, строим матрицу и сохраняем PNG.

3Проверяем

Сканируем с экрана и бумаги на двух телефонах.

Что именно хранится внутри QR-кода

Для быстрого варианта достаточно qrcode.make. Явный объект QRCode полезнее: вы контролируете box_size, border и уровень коррекции. border=4 оставляет стандартную тихую зону вокруг сетки, куда нельзя ставить текст или логотип.

ПараметрСтартовое значениеЧто меняет
versionNoneРазмер выбирается автоматически
error_correctionMЗапас восстановления
box_size12Пиксели одного модуля
border4Пустые модули вокруг кода

После этого шага у каждой части есть одна роль. Интерфейс собирает действие, логика меняет состояние, а вывод показывает признак успеха. Это проще отлаживать, чем один большой обработчик.

Путь от ссылки к PNG
Генерация заканчивается реальным сканом. Переход должен открыть точный адрес

Сначала соберите минимальный сценарий. Не добавляйте оформление, хранение и дополнительные режимы одновременно. Добейтесь одного правильного прохода от входных данных до результата, а затем проверяйте каждое улучшение отдельно.

Пишем генератор PNG на Python

Установите пакет в виртуальное окружение. В строку data положите конечный HTTPS-адрес. После make(fit=True) библиотека сама подберёт версию матрицы, а Pillow сохранит PNG.

# python -m pip install "qrcode[pil]"
import qrcode
from qrcode.constants import ERROR_CORRECT_M

data = "https://itcodik.com"

qr = qrcode.QRCode(
    version=None,
    error_correction=ERROR_CORRECT_M,
    box_size=12,
    border=4,
)
qr.add_data(data)
qr.make(fit=True)

image = qr.make_image(fill_color="#111827", back_color="white")
image.save("codik-qr.png")
print("Готово: codik-qr.png", image.size)
Что должно работать после первого запуска

Ссылка начинается с https и не содержит случайных пробелов. Размер матрицы выбирается автоматически. Вокруг кода остаётся border=4. Файл сохраняется как PNG и открывается обычной камерой.

Читаемость QR
Контраст важнее украшений. Сравнение показывает, какой вариант легче поддерживать и проверять.

Как размер, поля и коррекция влияют на чтение

Коррекция ошибок добавляет избыточность. Уровень M подходит для обычной чистой картинки. Высокий уровень иногда используют рядом с небольшим логотипом, но он увеличивает плотность. Логотип всё равно может перекрыть важные служебные области, поэтому каждую версию нужно сканировать.

РешениеПлюсРиск
Чёрный на беломМаксимальный контрастМинимум декора
Фирменный тёмный цветПоддерживает стильДолжен остаться контрастным
Логотип в центреУзнаваемостьЗакрывает модули
Длинная ссылкаБез редиректаБолее плотная матрица

Сохраняйте в одном месте то, что может измениться. Если одно и то же значение скопировано в три функции, после первой правки они начнут расходиться. Один объект состояния и одна функция отрисовки снимают эту проблему.

Смотрите на состояние, а не только на красивый экран. Перезагрузка, повторный клик, пустой ввод и медленный ответ часто открывают ошибки, которые не видны в идеальном демонстрационном проходе.

Практика: проверяем настоящий скан

Откройте PNG в масштабе 100%, затем уменьшите до предполагаемого размера. Сканируйте при ярком и тусклом свете, с экрана и распечатки. Проверьте адрес до перехода. QR-код без проверки может красиво выглядеть и вести на опечатку. Сделайте вторую версию с длинным URL и сравните плотность модулей. Так станет видно, почему короткий стабильный адрес легче читать на маленькой наклейке. Если код пойдёт в печать, попросите другого человека отсканировать пробный экземпляр с обычного расстояния. Автор часто знает, куда наводить камеру, и не замечает неудобный размер или блик.

Проверка своими руками
  1. Создайте виртуальное окружение и установите qrcode[pil].
  2. Сгенерируйте код для короткой HTTPS-ссылки.
  3. Откройте PNG и проверьте белое поле вокруг.
  4. Сканируйте двумя разными камерами.
  5. Поменяйте box_size и сравните файл.
  6. Замените цвет на фирменный тёмный и снова проверьте.
Готово, если выполняются все пункты

PNG существует и имеет достаточный размер. Тихая зона не обрезана. Камера быстро читает код с экрана. После скана открывается точный безопасный адрес.

Перед печатью
Четыре обязательные проверки. Пройдите все четыре сценария перед публикацией проекта.

Доводим QR-код до готового результата

Если ссылка может измениться, обычный QR-код придётся пересоздать. Для печатных материалов используйте короткий стабильный адрес на своём домене, который можно перенаправить позже. Не кодируйте секреты: содержимое QR считывается любым сканером.

Обрезан border

Камера хуже отделяет сетку от окружения.

Светлый код на светлом фоне

Контраста недостаточно.

Слишком длинная строка

Матрица становится плотной и мелкой.

Внутри пароль или токен

QR не шифрует данные.

Сверьтесь с первичным источником. Поведение используемых функций и ограничения примера проверяйте по страницей пакета qrcode в PyPI. Документация особенно важна, когда меняются версии, политика платформы или формат ответа API.

Что получится в итоге

Готовый результат проекта: Как создать QR-код на Python: текст, ссылка, цвета и проверка
В результате получается чистый PNG с QR-кодом, подписью назначения и безопасным свободным полем вокруг матрицы.

Короткие ответы
Что хранит QR-код?

Переданную строку, например URL, а не автоматически созданную короткую ссылку.

Зачем border=4?

Тихая зона помогает сканеру отделить код от окружения.

Можно ли хранить секрет?

Нет, любой сканер прочитает содержимое.

Как понять, что проект готов?

Он повторяет целевой сценарий несколько раз подряд, понятно реагирует на ошибочный ввод и не теряет состояние при обычных действиях.

Можно ли копировать код целиком?

Можно как стартовую точку, но сначала замените значения из примера, затем запустите проект по шагам. Если вы не можете объяснить одну строку, её лучше разобрать до следующего шага.

Создайте QR, который читается не только на вашем мониторе

Пакеты, файлы и виртуальные окружения разбираются в курсе Python. Если модуль не импортируется, откройте разбор ModuleNotFoundError.

Путь к сохранённому PNG можно проверить по гайду о FileNotFoundError. В Кодике сохраните генератор и несколько тестовых ссылок как отдельные версии.