import cv2
from pyzbar.pyzbar import decode
import datetime
import sys
from PIL import Image, ImageTk
import tkinter as tk
import os
import time

# 启动时间用于命名日志文件
start_time = datetime.datetime.now().strftime("%Y%m%d_%H%M")
result_log_file = f"result_{start_time}.log"

recognized_count = 0
seen_qrcodes = set()
seen_timestamps = {}

# 初始化 result 文件并写入第一行统计
with open(result_log_file, "w") as f:
    f.write("总识别二维码数量: 0\n")

# 初始化摄像头
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

if not cap.isOpened():
    print("❌ 摄像头打开失败")
    sys.exit(1)

print("✅ 摄像头已打开，开始捕获画面")

# 图形界面初始化
root = tk.Tk()
root.title("📷 QR Code Scanner")
label = tk.Label(root)
label.pack()

# 退出程序按钮
def exit_program():
    print("👋 点击退出按钮，程序退出")
    cap.release()
    root.destroy()

btn = tk.Button(root, text="退出程序", command=exit_program, font=("Arial", 12), bg="red", fg="white")
btn.pack(pady=10)

# 帧刷新处理函数
def update_frame():
    global recognized_count

    ret, frame = cap.read()
    if not ret or frame is None:
        root.after(30, update_frame)
        return

    decoded_objs = decode(frame)
    for obj in decoded_objs:
        if obj.type != "QRCODE":
            continue

        data = obj.data.decode('utf-8')
        now = time.time()

        if data not in seen_qrcodes:
            recognized_count += 1
            seen_qrcodes.add(data)
            seen_timestamps[data] = now

            # 更新 result 文件
            if os.path.exists(result_log_file):
                with open(result_log_file, "r") as f:
                    lines = f.readlines()[1:]  # 去除旧的第一行

            with open(result_log_file, "w") as f:
                f.write(f"总识别二维码数量: {recognized_count}\n")
                f.writelines(lines)
                f.write(f"{data}\n")

            print(f"✅ 识别成功（共 {recognized_count} 个）：{data}")
        else:
            last_seen = seen_timestamps.get(data, 0)
            if now - last_seen > 3:
                print(f"🔁 已识别过，忽略：{data}")
                seen_timestamps[data] = now

        # 画出二维码框
        cv2.rectangle(frame,
                      (obj.rect.left, obj.rect.top),
                      (obj.rect.left + obj.rect.width, obj.rect.top + obj.rect.height),
                      (0, 255, 0), 2)
        cv2.putText(frame, data, (obj.rect.left, obj.rect.top - 10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

    # 图像显示
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = ImageTk.PhotoImage(Image.fromarray(frame_rgb))
    label.config(image=img)
    label.image = img

    root.after(30, update_frame)

# 正常关闭窗口处理
root.protocol("WM_DELETE_WINDOW", exit_program)

update_frame()
root.mainloop()

