Post

Полное руководство для начинающих: генерация QR-кодов на Python

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

Полное руководство для начинающих: генерация QR-кодов на Python
🚀 Find Better AI Tools Faster Submit Your AI Tool & Reach Thousands of Builders Get Started →

Итак, давайте разберём это шаг за шагом.

Введение в QR-коды на Python

QR-коды прочно вошли в нашу повседневную жизнь и используются в самых разных областях: маркетинге, управлении складскими запасами, бесконтактных платежах. Это разновидность штрихкода, который можно быстро отсканировать камерой смартфона, чтобы получить доступ к информации или перейти на веб-сайт.

Python — популярный язык программирования для решения самых разных задач, включая генерацию и чтение QR-кодов. Для Python доступно несколько библиотек, которые заметно упрощают работу с QR-кодами. Эти библиотеки предоставляют простой и гибко настраиваемый способ создавать и сканировать QR-коды на Python.

Одно из главных преимуществ использования Python для генерации и чтения QR-кодов — простота и удобство. Python — высокоуровневый язык, который легко изучить, а его синтаксис интуитивно понятен и хорошо читается. Кроме того, в Python есть множество библиотек и инструментов, которые облегчают работу с QR-кодами.

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

Что такое QR-код?

QR-код — это двумерный штрихкод, который хранит информацию в машиночитаемом формате. Он был впервые изобретён в Японии в 1990-х годах для отслеживания автомобильных деталей, но с тех пор получил широкое распространение в самых разных сферах. Смартфоны, планшеты и другие устройства с камерой и приложением для чтения QR-кодов способны их распознавать. QR-коды могут хранить разные типы данных: текст, URL-адреса, контактную информацию или сведения о товаре. Их можно печатать на самых разных поверхностях — билбордах, постерах, визитках, упаковке товаров, — что делает их эффективным способом делиться информацией и взаимодействовать с клиентами.

Установка необходимых библиотек для работы с QR-кодами в Python

Прежде чем генерировать или читать QR-коды на Python, нужно установить необходимые библиотеки. К счастью, для Python доступно несколько библиотек, которые значительно упрощают работу с QR-кодами.

Две самые популярные библиотеки для генерации QR-кодов на Python — это qrcode и PyQRCode. Библиотека qrcode проста и удобна в использовании, позволяет создавать QR-коды с гибкой настройкой параметров. Библиотека PyQRCode написана на чистом Python и может генерировать QR-коды без внешних зависимостей.

Для установки этих библиотек можно использовать pip — стандартный менеджер пакетов Python. Сначала откройте терминал или командную строку и введите следующую команду, чтобы установить библиотеку qrcode:

1
pip install qrcode

Далее, чтобы установить библиотеку PyQRCode, введите следующую команду:

1
pip install pyqrcode

Библиотека ZBar — популярный выбор для чтения QR-кодов на Python. ZBar — это open-source набор инструментов для чтения штрихкодов из различных источников, включая файлы изображений и видеопотоки. Чтобы установить библиотеку ZBar, введите следующую команду:

1
pip install pyzbar

После установки библиотек можно приступать к генерации и чтению QR-кодов на Python. В следующем разделе мы рассмотрим, как генерировать QR-коды с помощью библиотек qrcode и PyQRCode.

Как создать генератор QR-кодов на Python?

Давайте напишем программу на Python, которая будет генерировать QR-код.

Генерация QR-кодов на Python — простой процесс, требующий всего нескольких строк кода. В этом разделе мы рассмотрим, как генерировать QR-коды с помощью библиотек qrcode и PyQRCode.

Генерация QR-кодов с помощью qrcode

Библиотека qrcode проста и удобна в использовании, позволяет создавать QR-коды с гибкой настройкой параметров. Вот пример того, как сгенерировать простой QR-код с помощью qrcode:

1
2
3
4
5
6
7
8
9
10
import qrcode

\# Generate QR code
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data("Hello, World!")
qr.make(fit=True)

\# Save QR code as the image file
img = qr.make_image(fill_color="black", back_color="white")
img.save("hello_world_qrcode.png")

В коде выше мы сначала импортируем библиотеку qrcode. Затем создаём объект QR-кода и задаём версию, размер блока и ширину рамки. После этого добавляем данные, которые хотим закодировать, в объект QR-кода и вызываем метод make(), чтобы сгенерировать QR-код. В конце сохраняем QR-код как файл изображения.

Генерация QR-кодов с помощью PyQRCode

Библиотека PyQRCode написана на чистом Python и может генерировать QR-коды без внешних зависимостей. Вот пример того, как сгенерировать простой QR-код с помощью PyQRCode:

1
2
3
4
5
6
7
import pyqrcode

\# Generate QR code
qr = pyqrcode.create("Hello, World!")

\# Save the QR code as an image file
qr.png("hello_world_qrcode.png", scale=6)

В коде выше мы сначала импортируем библиотеку PyQRCode. Затем создаём объект QR-кода и указываем данные, которые хотим закодировать. После этого вызываем метод png(), чтобы сгенерировать QR-код и сохранить его как файл изображения.

Библиотеки qrcode и PyQRCode предоставляют дополнительные возможности для настройки внешнего вида и поведения QR-кода — например, задание уровня коррекции ошибок или добавление логотипа на QR-код. Подробнее об этих опциях можно узнать в документации к каждой библиотеке.

Генерация QR-кода без внешних библиотек

В стандартной библиотеке Python нет поддержки QR-кодов, поэтому создать QR-код совсем без каких-либо библиотек не получится — разве что реализовать спецификацию ISO/IEC 18004 самостоятельно, включая коррекцию ошибок Рида — Соломона, маскирование и всё остальное. Обычно под «без внешних библиотек» подразумевают без скомпилированных или системных зависимостей, и вот это вполне достижимо:

  • PyQRCode (вместе с pypng для вывода в PNG) написана на чистом Python без C-расширений, поэтому pip install pyqrcode pypng работает везде, где есть Python. Пример с PyQRCode приведён выше.
  • qrcode требует Pillow только для вывода изображений; метод qrcode.make(data).get_matrix() или qrcode.QRCode.print_ascii() даёт вам код без зависимости от Pillow:
1
2
3
4
5
6
import qrcode

qr = qrcode.QRCode()
qr.add_data("https://khushaljethava.work")
qr.print_ascii()          # renders in the terminal, no Pillow needed
matrix = qr.get_matrix()  # list of lists of booleans, render however you like

Если ваше ограничение — «никакого pip install», честный ответ такой: обратитесь к системной утилите или воспользуйтесь готовым API для генерации QR-кодов — писать кодировщик вручную это проект на несколько дней, а не короткий сниппет.

Пример генератора QR-кода на Python с добавлением логотипа

Чтобы более наглядно показать, как генерировать QR-коды на Python, рассмотрим пример с использованием библиотеки qrcode.

Допустим, мы генерируем QR-код для URL-адреса сайта и хотим добавить логотип в центр QR-кода. Вот пример того, как сгенерировать QR-код с такими параметрами:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import qrcode

\# Generate QR code with logo
qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4)
qr.add_data("https://www.example.com/")
qr.make(fit=True)

\# Add logo to QR code
icon = qrcode.util.Octagon()
icon.add_data("Logo")
icon.make(fit=True)
qr_icon = qr.make_image(fill_color="black", back_color="white").copy()
qr_icon.paste(icon.make_image(fill_color="black", back_color="white").resize((40, 40)), (80, 80))

\# Save the QR code as the image file
qr_icon.save("website_qrcode.png")

В коде выше мы сначала импортируем библиотеку qrcode. Затем создаём объект QR-кода и задаём версию, уровень коррекции ошибок, размер блока и ширину рамки. После этого добавляем URL-адрес сайта, который хотим закодировать, в объект QR-кода и вызываем метод make(), чтобы сгенерировать QR-код.

Чтобы добавить логотип на QR-код, создаём отдельный объект QR-кода для логотипа и добавляем данные, которые хотим закодировать (в данном случае текст “Logo”). Затем создаём QR-код логотипа и изменяем его размер, чтобы он поместился в центре основного QR-кода, с помощью метода paste().

В конце сохраняем QR-код как файл изображения. При выполнении этого кода будет создан QR-код с указанным URL-адресом сайта и логотипом в центре.

В следующем разделе мы рассмотрим, как читать QR-коды с помощью Python.

Как сканировать QR-код с помощью Python? (Считыватель и декодер QR-кодов)

Чтение QR-кодов на Python столь же простое, как и их создание. Декодер QR-кодов на Python принимает изображение или кадр видео и возвращает закодированные в нём данные — ту же самую работу выполняет камера телефона, только без самой камеры. В этом разделе мы рассмотрим, как читать QR-коды с помощью библиотек pyzbar и zbarlight.

Чтение QR-кодов с помощью pyzbar

Библиотека pyzbar — это обёртка над библиотекой zbar, которая умеет читать различные штрихкоды, включая QR-коды. Вот пример того, как прочитать QR-код с помощью pyzbar:

1
2
3
4
5
6
7
8
9
10
11
import cv2
from pyzbar.pyzbar import decode

\# Load image
img = cv2.imread("qr_code.png")

\# Decode QR code
data = decode(img)\[0\].data.decode("utf-8")

\# Print decoded data
print(data)

В коде выше мы сначала импортируем cv2 и функцию decode из библиотеки pyzbar.pyzbar. Затем загружаем изображение с QR-кодом с помощью функции imread() из cv2.

Мы передаём изображение в функцию decode(), чтобы декодировать QR-код, которая возвращает список объектов Barcode. Поскольку на изображении только один QR-код, мы обращаемся к первому элементу списка и декодируем его данные с помощью метода decode(). Также указываем формат кодировки (в данном случае utf-8).

В конце выводим декодированные данные в консоль. При выполнении этого кода будут напечатаны данные, закодированные в QR-коде.

Чтение QR-кодов с помощью zbarlight

Библиотека zbarlight простая и лёгкая, позволяет читать QR-коды без внешних зависимостей. Вот пример того, как прочитать QR-код с помощью zbarlight:

1
2
3
4
5
6
7
8
9
10
11
import zbarlight

\# Load image
with open("qr_code.png", "rb") as image_file:
    image = image_file.read()

\# Decode QR code
data = zbarlight.scan_codes("qrcode", image)\[0\].decode("utf-8")

\# Print decoded data
print(data)

В коде выше мы сначала импортируем библиотеку zbarlight. Затем загружаем изображение с QR-кодом с помощью функции open() в режиме rb (чтение в бинарном формате).

Чтобы декодировать QR-код, передаём данные изображения в функцию scan_codes() вместе с типом кода, который хотим отсканировать (в данном случае qrcode). Обращаемся к первому элементу списка, возвращённого функцией, и декодируем его данные с помощью метода decode(). Также указываем формат кодировки (в данном случае utf-8).

В конце выводим декодированные данные в консоль. При выполнении этого кода будут напечатаны данные, закодированные в QR-коде.

В следующем разделе мы рассмотрим, как объединить генерацию и чтение QR-кодов с графическим интерфейсом на Python Tkinter.

Создание генератора QR-кодов на Python и Tkinter

С помощью Python и Tkinter можно легко создать собственный генератор QR-кодов для ввода данных и создания кастомных QR-кодов. В этом руководстве мы пройдём все шаги по созданию генератора QR-кодов на Python и Tkinter.

Сначала установим необходимые библиотеки для создания генератора QR-кодов с графическим интерфейсом.

1
pip install tk pillow

Теперь, когда нужные библиотеки установлены, можно приступать к созданию пользовательского интерфейса нашего генератора QR-кодов с помощью Tkinter.

Сначала нужно импортировать необходимые библиотеки:

1
2
3
import tkinter as tk
import qrcode
from PIL import Image, ImageTk

Далее нужно создать главное окно приложения:

1
2
root = tk.Tk()
root.title("QR Code Generator")

Также можно задать размер и положение окна:

1
2
3
4
5
6
7
8
9
width = 400
height = 500
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

x = (screen_width / 2\) \- (width / 2\)
y = (screen_height / 2\) \- (height / 2\)

root.geometry("%dx%d+%d+%d" % (width, height, x, y))

Далее создадим подписи и поля ввода, чтобы пользователь мог ввести свои данные:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
label = tk.Label(root, text="Enter data to encode:")
label.pack(pady=10)

data_entry = tk.Entry(root, width=30)
data_entry.pack(pady=10)

label2 = tk.Label(root, text="Select the size of the QR code:")
label2.pack(pady=10)

size_var = tk.StringVar()
size_var.set("7")

size_options = \["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"\]
size_dropdown = tk.OptionMenu(root, size_var, \*size_options)
size_dropdown.pack(pady=10)

Также можно добавить кнопку, при нажатии на которую пользователь будет генерировать QR-код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def generate_qr():
    data = data_entry.get()
size = int(size_var.get())

qr = qrcode.QRCode(
version=1,
box_size=size,
border=5
)

qr.add_data(data)
qr.make(fit=True)

img = qr.make_image(fill="black", back_color="white")
img.save("qrcode.png")

image = Image.open("qrcode.png")
image = image.resize((250, 250), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)

qr_label.config(image=photo)
qr_label.image = photo

button = tk.Button(root, text="Generate QR Code", command=generate_qr)
button.pack(pady=10)

Наконец, создадим подпись для отображения сгенерированного QR-кода:

1
2
3
qr_label = tk.Label(root)
qr_label.pack(pady=10)
root.mainloop()

Так мы создаём простой пользовательский интерфейс для нашего генератора QR-кодов, который позволяет пользователям вводить данные, выбирать размер кода и генерировать QR-код. Сгенерированный код отображается в окне приложения.

После нажатия кнопки изображение будет сохранено в той же папке.

Итак, у нас уже есть программа с графическим интерфейсом, которая генерирует QR-код, а теперь мы напишем программу, которая будет сканировать QR-код с помощью Python.

Создание сканера QR-кодов на Python и Tkinter

В этом разделе мы рассмотрим сканирование и декодирование QR-кодов с помощью Python и библиотеки Tkinter. Наша программа на Python позволит извлекать данные из QR-кодов, такие как URL-адреса или контактная информация. Начнём!

Прежде чем создавать наш сканер QR-кодов, нужно установить несколько необходимых библиотек. Мы будем использовать библиотеки pyzbar и Pillow для декодирования QR-кодов и обработки изображений. Установить эти библиотеки можно с помощью pip. Откройте терминал или командную строку и введите следующие команды:

1
2
pip install pyzbar
pip install Pillow

После установки необходимых библиотек можно создать пользовательский интерфейс с помощью Tkinter. Нам понадобится подпись для отображения изображения QR-кода и кнопка для запуска сканирования. Вот код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk, Image
import pyzbar.pyzbar as pyzbar

class QRScanner:
    def __init__(self, master):
    self.master = master
master.title("QR Code Scanner")

self.label = tk.Label(master)
self.label.pack()

self.button = tk.Button(master, text="Scan", command=self.scan)
self.button.pack()

def scan(self):
    filename = filedialog.askopenfilename()
img = Image.open(filename)

decoded_objects = pyzbar.decode(img)
for obj in decoded_objects:
    print("Type:", obj.type)
print("Data:", obj.data.decode("utf-8"))

img = ImageTk.PhotoImage(img)
self.label.configure(image=img)
self.label.image = img

root = tk.Tk()
width = 400
height = 500
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

x = (screen_width / 2\) \- (width / 2\)
y = (screen_height / 2\) \- (height / 2\)

root.geometry("%dx%d+%d+%d" % (width, height, x, y))

scanner = QRScanner(root)
root.mainloop()

Сначала в коде выше мы импортируем необходимые библиотеки и определяем класс QRScanner. Мы создаём окно с помощью Tkinter и добавляем подпись и кнопку. При нажатии на кнопку вызывается метод scan(). Этот метод открывает диалоговое окно выбора файла, позволяя пользователю выбрать изображение с QR-кодом. После выбора изображения мы используем библиотеку pyzbar, чтобы декодировать данные QR-кода. Затем выводим в консоль тип данных и декодированные данные. Наконец, отображаем изображение QR-кода в подписи с помощью библиотеки Pillow.

Теперь, когда код нашего сканера QR-кодов написан, давайте его протестируем. Сохраните приведённый выше код в файл Python, например qrscanner.py. Откройте терминал или командную строку и перейдите в папку, где сохранён файл. Затем введите следующую команду, чтобы запустить программу:

| python qrscanner.py | | :—- |

Программа должна открыть окно с кнопкой “Scan”. Нажмите на кнопку и выберите изображение с QR-кодом. Декодированные данные будут выведены в консоль.

Лучшие практики работы с QR-кодами

Хотя генерация и чтение QR-кодов на Python — довольно простая задача, важно следовать некоторым лучшим практикам, чтобы получить наилучший результат. Вот несколько советов, о которых стоит помнить при работе с QR-кодами на Python:

  1. Выбирайте надёжную библиотеку для работы с QR-кодами: несмотря на то, что для генерации и чтения QR-кодов на Python доступно множество библиотек, важно выбрать надёжную, которая активно поддерживается и имеет хорошую документацию.
  2. Используйте качественные изображения: при генерации QR-кодов используйте изображения высокого качества, чтобы обеспечить их сканируемость. Аналогично, при чтении QR-кодов убедитесь, что изображение чёткое и в фокусе, чтобы избежать ошибок.
  3. Тестируйте на разных устройствах: тестируйте QR-коды на разных устройствах (например, смартфонах или планшетах), чтобы убедиться в совместимости и читаемости. Разные устройства могут иметь разное разрешение камеры и версии программного обеспечения, что может повлиять на процесс сканирования QR-кода.
  4. Не усложняйте: при генерации QR-кодов старайтесь, чтобы данные были максимально простыми — это обеспечит хорошую сканируемость кода. Избегайте добавления лишних элементов, например логотипов или изображений, которые могут мешать считыванию QR-кода.
  5. Проверяйте данные: проверяйте данные перед генерацией QR-кода, чтобы убедиться в их точности. Это поможет избежать ошибок и обеспечит сканируемость QR-кода.

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

В следующем разделе мы рассмотрим несколько практических применений QR-кодов на Python.

Заключение

QR-коды — универсальный и мощный инструмент, который Python позволяет быстро генерировать и читать. Такие лучшие практики, как использование надёжных библиотек, тестирование на разных устройствах и упрощение данных, помогут сделать ваши QR-коды более эффективными. Кроме того, такие приёмы, как использование динамических кодов и добавление призыва к действию, могут улучшить пользовательский опыт.

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

Часто задаваемые вопросы

Вопрос: Что такое QR-код и как использовать Python для их генерации и чтения? Ответ: QR-код — это двумерный штрихкод, который может хранить самые разные типы данных, включая URL-адреса, контактную информацию и многое другое. С помощью Python можно быстро генерировать и читать QR-коды, используя такие библиотеки, как qrcode и pyzbar.

Вопрос: Как использовать Tkinter для создания пользовательского интерфейса генератора QR-кодов на Python? Ответ: Tkinter — популярная библиотека Python для создания графических пользовательских интерфейсов (GUI). С помощью Tkinter можно создать простой и удобный интерфейс для генератора QR-кодов, который позволит пользователям вводить данные и создавать коды всего в несколько кликов.

Вопрос: Можно ли сканировать и декодировать QR-коды с помощью Python? Ответ: Да, доступно несколько библиотек Python, которые позволяют сканировать и декодировать QR-коды с изображений или видеопотоков. Pyzbar — популярная библиотека для декодирования QR-кодов, а OpenCV можно использовать для декодирования в реальном времени по видео.

Вопрос: Что делает параметр version в библиотеке qrcode на Python, и как fit=True влияет на его поведение? Ответ: version — это размер символа QR-кода, целое число от 1 (сетка 21×21 модуль) до 40 (сетка 177×177 модулей). С каждым шагом вверх добавляется по 4 модуля с каждой стороны и увеличивается объём данных, который можно закодировать. Когда вы вызываете qr.make(fit=True), библиотека игнорирует слишком маленькое значение version и увеличивает его до минимального размера, который действительно вмещает ваши данные, то есть fit=True задаёт нижнюю границу, а не фиксированный размер. При fit=False используется именно та версия, которую вы задали, и при кодировании возникает ошибка DataOverflowError, если данные не помещаются. Указание version=None вместе с fit=True позволяет библиотеке самой выбрать подходящий размер — это самый безопасный вариант по умолчанию для данных, введённых пользователем.

Вопрос: Какую библиотеку использовать в качестве считывателя или декодера QR-кодов на Python? Ответ: pyzbar — это обычный выбор для декодирования QR-кодов из файлов изображений, а zbarlight служит альтернативой — обе рассмотрены в разделе о сканировании выше. Если вы хотите избежать системной зависимости от ZBar, у OpenCV есть собственный декодер: data, points, _ = cv2.QRCodeDetector().detectAndDecode(image) сразу возвращает декодированную строку и работает в том числе с кадрами с веб-камеры.

Вопрос: Есть ли лучшие практики, которым стоит следовать при работе с QR-кодами на Python? Ответ: Да, при работе с QR-кодами на Python стоит придерживаться нескольких лучших практик: использовать надёжные библиотеки, тестировать на разных устройствах и не усложнять данные. Кроме того, использование динамических кодов, добавление призыва к действию и анализ данных помогут сделать ваши QR-коды более эффективными.

Вопрос: Какие есть ограничения у QR-кодов и как их учитывать при создании кодов на Python? Ответ: К некоторым ограничениям QR-кодов относится необходимость смартфона или другого устройства с камерой, а также ограниченная ёмкость данных самих кодов. Учитывая эти ограничения и по возможности их компенсируя — например, используя код меньшего размера и предлагая альтернативные варианты для тех, у кого нет подходящего устройства, — вы сможете создавать практичные и доступные QR-коды на Python.

Khushal Jethava
Khushal Jethava

Machine Learning Engineer at Codiste, specializing in Generative AI, NLP, and Computer Vision. Building production AI systems with Python.

🚀 Find Better AI Tools Faster Submit Your AI Tool & Reach Thousands of Builders Get Started →
This post is licensed under CC BY 4.0 by the author.
🚀 Find Better AI Tools Faster Submit Your AI Tool & Reach Thousands of Builders Get Started →
🚀 Find Better AI Tools Faster Submit Your AI Tool & Reach Thousands of Builders Get Started →