Table of Contents

qr.jpg

Некоторое время назад я написал статью, где показывал построение простого виджета часов на 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)

Должно получиться примерно вот так:

cliqr

Закончив с консольной версией, приступим к построению графического интерфейса. Сделаем это в отдельном файле, во благо удобства. Судя по началу статьи очевидно, что будем использовать 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()

В итоге получаем следующее:

gui_qr

А что если пользователю предоставить возможность выбирать режим? Рациональнее предложить интерфейс выбора, чем вручную выбирать необходимый файлик. Потому давайте создадим этот интерфейс, в файле 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.