亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Python實現全自動二維碼識別

 更新時間:2023年11月23日 10:00:31   作者:mYlEaVeiSmVp  
這篇文章主要為大家詳細介紹了如何基于Python實現全自動二維碼識別功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

純筆記,可以做到全屏識別二維碼,自動識別,復制鏈接,生成簡單的二維碼,將識別到的內容轉為txt

實現代碼

import pyautogui
from PIL import Image
from pyzbar.pyzbar import decode
import tkinter as tk
from tkinter import Label, Button, Listbox, Entry, END, SINGLE, filedialog
import threading
import time
import qrcode
from PIL import ImageTk
import cv2

class QRCodeScannerApp:
def init(self, root):
self.root = root
self.root.title("二維碼識別器專業(yè)版")
    # 設置窗口的默認大小
    self.root.geometry("1600x1200")
 
    # 創(chuàng)建頂部功能按鈕區(qū)域
    self.button_frame = tk.Frame(root)
    self.button_frame.pack(pady=10)
 
    self.prompt_label = Label(root, text="請選中歷史記錄欄的記錄以啟用某些功能", fg="red")
    self.prompt_label.pack(pady=5)
 
    # 將所有按鈕移到button_frame中,并將它們設置為橫向布局
    self.capture_button = Button(self.button_frame, text="捕獲屏幕并識別", command=self.capture_screen_and_recognize)
    self.capture_button.grid(row=0, column=0, padx=5)
 
    self.batch_scan_button = Button(self.button_frame, text="導入圖片并識別", command=self.batch_scan)
    self.batch_scan_button.grid(row=0, column=1, padx=5)
 
    self.autoscan_button = Button(self.button_frame, text="開始自動掃描", command=self.start_auto_scan)
    self.autoscan_button.grid(row=0, column=2, padx=5)
 
    self.stop_button = Button(self.button_frame, text="停止掃描", command=self.stop_scan, state=tk.DISABLED)
    self.stop_button.grid(row=0, column=3, padx=5)
 
    self.copy_button = Button(self.button_frame, text="復制選中的歷史記錄", command=self.copy_selected_history)
    self.copy_button.grid(row=0, column=4, padx=5)
 
    self.save_button = Button(self.button_frame, text="保存歷史記錄為TXT", command=self.save_history_to_txt)
    self.save_button.grid(row=0, column=5, padx=5)
 
    self.generate_button = Button(self.button_frame, text="生成二維碼", command=self.generate_qrcode)
    self.generate_button.grid(row=0, column=6, padx=5)
 
    self.delete_history_button = Button(self.button_frame, text="刪除選中歷史記錄", command=self.delete_selected_history)
    self.delete_history_button.grid(row=0, column=7, padx=5)
 
    self.clear_history_button = Button(self.button_frame, text="清空所有歷史記錄", command=self.clear_all_history)
    self.clear_history_button.grid(row=0, column=8, padx=5)
 
    self.search_button = Button(self.button_frame, text="搜索", command=self.search_history)
    self.search_button.grid(row=0, column=9, padx=5)
 
    self.export_button = Button(self.button_frame, text="導出QR碼圖像", command=self.export_qr_code)
    self.export_button.grid(row=0, column=10, padx=5)
 
    # 文本和輸入部分
    self.label = Label(root, text="掃描結果:")
    self.label.pack(pady=10)
 
    self.result_label = Label(root, text="", wraplength=500)
    self.result_label.pack(pady=10)
 
    self.current_label = Label(root, text="當前識別:")
    self.current_label.pack(pady=10)
 
    # 增加寬度
    self.current_listbox_scrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
    self.current_listbox_scrollbar.pack(fill=tk.X)
    self.current_listbox = Listbox(root, selectmode=SINGLE, height=10, width=250,
                                   xscrollcommand=self.current_listbox_scrollbar.set)
    self.current_listbox.pack(pady=10)
    self.current_listbox_scrollbar.config(command=self.current_listbox.xview)
 
    self.history_label = Label(root, text="歷史記錄:")
    self.history_label.pack(pady=10)
 
    self.history_listbox_scrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
    self.history_listbox_scrollbar.pack(fill=tk.X)
    self.history_listbox = Listbox(root, selectmode=SINGLE, height=10, width=250,
                                   xscrollcommand=self.history_listbox_scrollbar.set)
    self.history_listbox.pack(pady=10)
    self.history_listbox_scrollbar.config(command=self.history_listbox.xview)
 
    self.interval_label = Label(root, text="掃描間隔時間 (毫秒):")
    self.interval_label.pack(pady=10)
 
    self.interval_entry = Entry(root)
    self.interval_entry.pack(pady=10)
    self.interval_entry.insert(0, "500")
 
    self.generate_label = Label(root, text="輸入要生成的內容:")
    self.generate_label.pack(pady=10)
 
    self.generate_entry = Entry(root)
    self.generate_entry.pack(pady=10)
 
    self.search_label = Label(root, text="搜索歷史:")
    self.search_label.pack(pady=10)
 
    self.search_entry = Entry(root)
    self.search_entry.pack(pady=10)
 
    # 其他屬性
    self.auto_scanning = False
    self.history = []
    self.history_counter = 0
    self.seen_qrcodes = set()
 
def clear_all_history(self):
    self.history.clear()
    self.history_listbox.delete(0, END)
 
# 添加搜索歷史記錄的函數
def search_history(self):
    query = self.search_entry.get().lower()
    self.history_listbox.delete(0, END)
    for item in self.history:
        if query in item.lower():
            self.history_listbox.insert(END, item)
 
def export_qr_code(self):
    selected_index = self.history_listbox.curselection()
    if selected_index:
        selected_data = self.history[int(selected_index[0])]
        content_without_number = selected_data.split(': ', 1)[-1]
 
        # 使用PIL庫創(chuàng)建QR碼圖像
        qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4)
        qr.add_data(content_without_number)
        qr.make(fit=True)
        qr_image = qr.make_image(fill_color="black", back_color="white")
 
        # 選擇保存路徑
        file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG Files", "*.png")])
 
        # 如果用戶選擇了路徑,則保存QR碼圖像
        if file_path:
            qr_image.save(file_path)
 
# 添加新的函數生成二維碼并在新窗口中顯示
def generate_qrcode(self):
    qr_data = self.generate_entry.get()
    if qr_data:
        qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4)
        qr.add_data(qr_data)
        qr.make(fit=True)
        img = qr.make_image(fill_color="black", back_color="white")
 
        # 在新窗口中顯示二維碼
        new_window = tk.Toplevel(self.root)
        new_window.title("生成的二維碼")
 
        qr_image = ImageTk.PhotoImage(img)  # 將PIL圖像轉換為Tkinter可使用的圖像
        qr_label = Label(new_window, image=qr_image)
        qr_label.image = qr_image  # 保存圖像的引用以防被垃圾收集器回收
        qr_label.pack()
 
def start_auto_scan(self):
    """開始自動掃描"""
    self.auto_scanning = True
    self.autoscan_button.config(state=tk.DISABLED)
    self.stop_button.config(state=tk.NORMAL)
    self.auto_scan()
 
def stop_scan(self):
    """停止自動掃描"""
    self.auto_scanning = False
    self.autoscan_button.config(state=tk.NORMAL)
    self.stop_button.config(state=tk.DISABLED)
 
def auto_scan(self):
    if self.auto_scanning:
        # 啟動一個線程來異步執(zhí)行屏幕捕捉和二維碼識別
        threading.Thread(target=self.capture_screen_and_recognize, daemon=True).start()
 
        try:
            interval = int(self.interval_entry.get())
        except ValueError:
            interval = 500
        self.root.after(interval, self.auto_scan)
 
def capture_screen_and_recognize(self):
    start_time = time.time()
    screenshot = pyautogui.screenshot()
    image = Image.frombytes('RGB', screenshot.size, screenshot.tobytes())
    decoded_objects = decode(image)
 
    new_qrcodes = []
 
    if decoded_objects:
        for obj in decoded_objects:
            data = obj.data.decode("utf-8")
            if data not in self.seen_qrcodes:  # 如果這是一個新的二維碼數據
                self.seen_qrcodes.add(data)
                new_qrcodes.append(data)
 
        if new_qrcodes:  # 如果有新的二維碼,清除當前識別列表框
            self.current_listbox.delete(0, END)
 
        elapsed_time = time.time() - start_time  # 計算花費的時間
        self.result_label.config(text=f"識別到 {len(new_qrcodes)} 個新二維碼,耗時 {elapsed_time:.3f} 秒")
 
        for i, data in enumerate(new_qrcodes):
            self.history_counter += 1
            self.current_listbox.insert(END, f"{self.history_counter}: {data}")
            self.history.append(f"{self.history_counter}: {data}")
            self.history_listbox.insert(END, f"{self.history_counter}: {data}")
    else:
        self.result_label.config(text="未找到二維碼")
 
def copy_selected_history(self):
    selected_index = self.history_listbox.curselection()
    if selected_index:
        selected_data = self.history[int(selected_index[0])]
        # 使用字符串切片去掉標號
        content_without_number = selected_data.split(': ', 1)[-1]
        self.root.clipboard_clear()
        self.root.clipboard_append(content_without_number)
        self.root.update()
 
def save_history_to_txt(self):
    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")])
    if file_path:
        with open(file_path, "w") as file:
            for item in self.history:
                file.write(item + "\n")
 
# 添加新的函數來批量掃描圖片
def batch_scan(self):
    file_paths = filedialog.askopenfilenames(title="選擇圖片", filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
 
    for file_path in file_paths:
        image = cv2.imread(file_path)
 
        # 調整圖片大小,以適應屏幕捕獲的分辨率
        scaled_image = cv2.resize(image, (self.root.winfo_screenwidth(), self.root.winfo_screenheight()))
        screenshot = Image.fromarray(cv2.cvtColor(scaled_image, cv2.COLOR_BGR2RGB))
 
        # 在屏幕截圖上識別二維碼
        decoded_objects = decode(screenshot)
 
        new_qrcodes = []
 
        if decoded_objects:
            for obj in decoded_objects:
                data = obj.data.decode("utf-8")
                if data not in self.seen_qrcodes:  # 如果這是一個新的二維碼數據
                    self.seen_qrcodes.add(data)
                    new_qrcodes.append(data)
 
            for i, data in enumerate(new_qrcodes):
                self.history_counter += 1
                self.current_listbox.insert(END, f"{self.history_counter}: {data}")
                self.history.append(f"{self.history_counter}: {data}")
                self.history_listbox.insert(END, f"{self.history_counter}: {data}")
        else:
            self.result_label.config(text="未找到二維碼")
 
        self.root.update()  # 更新GUI以顯示結果
 
# 添加刪除和清空歷史記錄的函數
def delete_selected_history(self):
    selected_index = self.history_listbox.curselection()
    if selected_index:
        del self.history[int(selected_index[0])]
        self.history_listbox.delete(selected_index)
        
if name == "main":
root = tk.Tk()
app = QRCodeScannerApp(root)
root.mainloop()

實現效果

到此這篇關于基于Python實現全自動二維碼識別的文章就介紹到這了,更多相關Python二維碼識別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python函數的迭代器與生成器的示例代碼

    Python函數的迭代器與生成器的示例代碼

    這篇文章主要介紹了Python函數的迭代器與生成器的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Python文本預處理學習指南

    Python文本預處理學習指南

    文本預處理是指在進行自然語言處理(NLP)任務之前,對原始文本數據進行清洗、轉換和標準化的過程,本文主要為大家介紹了文本預處理的使用,需要的可以參考下
    2023-07-07
  • 舉例講解Python的Tornado框架實現數據可視化的教程

    舉例講解Python的Tornado框架實現數據可視化的教程

    這篇文章主要介紹了舉例講解Python的Tornado框架實現數據可視化的教程,Tornado是一個異步的高人氣開發(fā)框架,需要的朋友可以參考下
    2015-05-05
  • matplotlib中plt.hist()參數解釋及應用實例

    matplotlib中plt.hist()參數解釋及應用實例

    本文主要介紹了matplotlib中plt.hist()參數解釋及應用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Python pip使用超時問題解決方案

    Python pip使用超時問題解決方案

    這篇文章主要介紹了Python pip使用超時問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • TensorFlow實現iris數據集線性回歸

    TensorFlow實現iris數據集線性回歸

    這篇文章主要介紹了TensorFlow實現iris數據集線性回歸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python字符串基礎操作詳解

    python字符串基礎操作詳解

    這篇文章主要為大家詳細介紹了python字符串基礎操作,,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • python使用pandas按照行數分割表格

    python使用pandas按照行數分割表格

    本文主要介紹了python使用pandas按照行數分割表格,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python編程中*args與**kwargs區(qū)別作用詳解

    Python編程中*args與**kwargs區(qū)別作用詳解

    這篇文章主要介紹了Python編程中*args與**kwargs區(qū)別作用詳解
    2021-10-10
  • python flask框架實現傳數據到js的方法分析

    python flask框架實現傳數據到js的方法分析

    這篇文章主要介紹了python flask框架實現傳數據到js的方法,結合實例形式分析了前端數據序列化及后臺Flask交互數據返回相關操作技巧,需要的朋友可以參考下
    2019-06-06

最新評論