Qr генератор на python
Table of Contents
Некоторое время назад я написал статью, где показывал построение простого виджета часов на tkinter. Если кто-то не помнит, то tkinter - это кроссплатформенная библиотека для разработки графического интерфейса на языке Python.
И в то или иное время у меня возникает потребность в написании простых программ, и неважно, будь это прямая потребность или просто желание постучать пальцами по клавиатуре. По мимо этого я люблю копаться в репозитории библиотек python.
Среди всего этого разнообразия пакетов мне приглянулся PyQRCode. Из названия очевидно, что этот пакет предназначен для работы с qr кодами. Потому давайте напишем простую программу для генерирования qr по введённому url. Сразу скажу, что напишем две версии: консольную и с графическим интерфейсом.
Для начала давайте инсталлируем необходимый пакет:
pip install pyqrcode
Теперь перейдём непосредственно к написанию кода. Импортируем необходимые модули, при этом не забыв в начале файла прописать путь для интерпретатора:
#!/usr/bin/python3
from pyqrcode import create
Прописываем приглашение в командной строке. Затем создаём переменную URL, где мы можем указать необходимый адрес, для последующей генерации qr. В данном кусочке кода create отвечает за непосредственную генерацию.
print("please,type url:")
url = create(input(''))
К примеру достаточно вот такой строчки для генерации qr кода гугла:
url = pyqrcode.create('https://google.com')
Затем задаём параметры(например размер) отображения:
url.svg('code.svg', scale=8)
И создаём рамки вокруг кода, если это необходимо:
print(url.terminal(quiet_zone=2)
Должно получиться примерно вот так:
Закончив с консольной версией, приступим к построению графического интерфейса. Сделаем это в отдельном файле, во благо удобства. Судя по началу статьи очевидно, что будем использовать tk.
Импортируем библиотеки
from tkinter import *
from tkinter import messagebox
import pyqrcode
Инициализируем окно и заголовок:
window = Tk() #init
window.title("PyQr") #title
Создаём функцию, где указываем все параметры, такой подход необходим для возможного дальнейшего масштабирования программы. По мимо аргументов в функции генерации создадим вывод сообщения об ошибке:
def generate():
if len(subject.get()) != 0:
global myQr
myQr= pyqrcode.create(subject.get())
qrImage= myQr.xbm(scale=6)
global photo
photo = BitmapImage(data= qrImage)
else:
messagebox.showinfo("Error!", "Please Enter The Subject")
try:
showCode()
except:
pass
Сгенерированые данные передадим функции showCode. Её задача проста - выводить qr код с введённым url:
def showCode():
global photo
notificationLabel.config(image= photo)
subLabel.config(text= "Showing QR Code for: "+subject.get())
Зададим формы и элементы:
lab1 = Label(window, text="Enter Subject", font=( 12))
lab1.grid(row=0, column= 0, sticky= N+S+E+W)
subject= StringVar()
subjectEntry = Entry(window, textvariable = subject,font=( 12))
subjectEntry.grid(row=0, column=1, sticky= N+S+E+W)
createButton = Button(window, text= "Create QR Code", font=(12), width= 15,command= generate)
createButton.grid(row=0, column=3, sticky= N+S+E+W)
notificationLabel= Label(window)
notificationLabel.grid(row= 2, column=1, sticky= N+S+E+W)
subLabel= Label(window, text="")
subLabel.grid(row= 3, column=1, sticky= N+S+E+W)
totalRows= 10
totalCols = 10
for row in range(totalRows+1):
window.grid_rowconfigure(row, weight=1)
for col in range(totalCols+1):
window.grid_columnconfigure(col, weight=1)
И естественно прописываем mainloop:
window.mainloop()
В итоге получаем следующее:
А что если пользователю предоставить возможность выбирать режим? Рациональнее предложить интерфейс выбора, чем вручную выбирать необходимый файлик. Потому давайте создадим этот интерфейс, в файле choise.py напишем следующее:
choise = input('CLI/gui mode?; Type C to use cli or type g to use gui: ')
if choise == "c":
import cli
if choise == "C":
import cli
if choise == "g":
import main
if choise == "G":
import main
else:
print("please, enter a valid letter")
А именно: делаем инпут по вопросу о выборе режима. В зависимости от выбранной буквы(в не зависимости от регистра) импортируем код либо терминальной версии ,либо графической. В качестве cli-версии импортируем файл cli без префикса “.py”, аналогично импортируется gui(пакет main). А в случае неправильно введённой переменной просим пользователя ввести правильную букву.
Думаю, что получилось неплохо. Традиционно код программы расположен в моём GitHub аккаунте. Буду рад любым предложениям и критике , как в комментариях, так и в issues или pull request.