Create a QR Scanner using Python3

Ilham Masykuri Hadi
2 min readFeb 1, 2023

--

import cv2
import pyzbar.pyzbar as pyzbar
import threading
import tkinter as tk
import numpy as np
from PIL import Image, ImageTk
from tkinter import messagebox, scrolledtext
import re

def read_qr_code():
# membaca frame dari webcam
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()

# mencari dan mengambil data dari QR code
decoded_objs = pyzbar.decode(frame)
for obj in decoded_objs:
data = obj.data.decode('utf-8')
break
else:
data = ''

# mengkonversi frame ke format yang dapat diterima oleh tkinter
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = Image.fromarray(frame)
frame = ImageTk.PhotoImage(frame)

# menampilkan hasil dari QR code pada label dan gambar
text.delete(1.0, tk.END)
text.insert(tk.INSERT, data)
label2.config(image=frame)
label2.image = frame

# mengakhiri loop jika tombol stop ditekan
if stop_flag.is_set():
break

# menutup kamera
cap.release()

def start_reading():
# memulai thread baru untuk membaca QR code
t = threading.Thread(target=read_qr_code)
t.start()

def stop_reading():
# mengatur stop flag untuk mengakhiri loop pembacaan QR code
stop_flag.set()

def copy_result():
# menyimpan hasil scan ke clipboard
result = text.get(1.0, tk.END)
root.clipboard_clear()
root.clipboard_append(result)
messagebox.showinfo("Information", "Result has been copied to clipboard.")


# membuat GUI menggunakan tkinter
root = tk.Tk()
root.title("QR Code Reader")

frame = tk.Frame(root)
frame.pack(pady=10)

text = scrolledtext.ScrolledText(frame, height=5)
text.pack()

label2 = tk.Label(frame)
label2.pack()

frame2 = tk.Frame(root)
frame2.pack()

tk.Button(frame2, text="Start", command=start_reading).pack(side=tk.LEFT, padx=5)
tk.Button(frame2, text="Stop", command=stop_reading).pack(side=tk.LEFT, padx=5)
tk.Button(frame2, text="Copy", command=copy_result).pack(side=tk.LEFT, padx=5)

root.mainloop()

example result of application

--

--