import tkinter as tk
from tkinter import ttk, messagebox
import serial
import serial.tools.list_ports
from datetime import datetime
import threading
# UID ( )
AUTHORIZED_TAGS = {
"44 1D 43 02": " ",
"A3 B4 85 13": " "
}
class RFIDApp:
def __init__(self, root):
self.root = root
self.root.title(" RFID")
self.root.geometry("500x400")
self.ser = None
self.running = False
#
self.create_widgets()
#
self.auto_connect_arduino()
def create_widgets(self):
#
settings_frame = ttk.LabelFrame(self.root, text=" ")
settings_frame.pack(pady=10, padx=10, fill="x")
self.port_combo = ttk.Combobox(settings_frame)
self.port_combo.pack(side="left", padx=5, pady=5)
refresh_btn = ttk.Button(settings_frame, text=" ", command=self.update_ports)
refresh_btn.pack(side="left", padx=5)
connect_btn = ttk.Button(settings_frame, text="", command=self.toggle_connection)
connect_btn.pack(side="left", padx=5)
#
self.status_label = ttk.Label(self.root, text=": ", foreground="red")
self.status_label.pack(pady=5)
#
self.message_text = tk.Text(self.root, height=10, state="disabled")
self.message_text.pack(pady=10, padx=10, fill="both", expand=True)
#
exit_btn = ttk.Button(self.root, text="", command=self.on_close)
exit_btn.pack(pady=5)
def auto_connect_arduino(self):
ports = serial.tools.list_ports.comports()
for port in ports:
if "Arduino" in port.description:
self.connect_to_port(port.device)
return
self.update_ports()
def update_ports(self):
ports = [port.device for port in serial.tools.list_ports.comports()]
self.port_combo["values"] = ports
if ports:
self.port_combo.current(0)
def toggle_connection(self):
if self.ser and self.ser.is_open:
self.stop_serial()
else:
port = self.port_combo.get()
if port:
self.connect_to_port(port)
def connect_to_port(self, port):
try:
self.ser = serial.Serial(
port=port,
baudrate=9600,
timeout=1
)
self.running = True
threading.Thread(target=self.read_serial, daemon=True).start()
self.status_label.config(text=f": {port}", foreground="green")
except Exception as e:
messagebox.showerror("", f" :\n{str(e)}")
def stop_serial(self):
self.running = False
if self.ser:
self.ser.close()
self.status_label.config(text=": ", foreground="red")
def read_serial(self):
buffer = ""
while self.running and self.ser.is_open:
try:
data = self.ser.readline().decode("utf-8").strip()
if data:
if "UID:" in data:
uid = data.split("UID:")[1].strip()
self.process_rfid(uid)
except UnicodeDecodeError:
continue
except Exception as e:
print(f"Error: {str(e)}")
self.stop_serial()
def process_rfid(self, uid):
self.root.after(0, self.update_ui, uid)
def update_ui(self, uid):
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"[{now}] UID : {uid}\n"
self.message_text.config(state="normal")
self.message_text.insert("end", log_entry)
self.message_text.see("end")
self.message_text.config(state="disabled")
if uid in AUTHORIZED_TAGS:
user = AUTHORIZED_TAGS[uid]
success_msg = f" \n: {user}\n{now}"
self.show_message(success_msg, "green")
#
if self.ser:
self.ser.write(b'OPEN')
else:
error_msg = f" \nUID: {uid}\n{now}"
self.show_message(error_msg, "red")
def show_message(self, message, color):
top = tk.Toplevel(self.root)
top.title(" ")
top.geometry("300x150")
label = ttk.Label(top, text=message, foreground=color, font=("Tahoma", 12))
label.pack(pady=20)
ok_btn = ttk.Button(top, text="", command=top.destroy)
ok_btn.pack(pady=10)
def on_close(self):
self.stop_serial()
self.root.destroy()
if __name__ == "__main__":
root = tk.Tk()
app = RFIDApp(root)
root.mainloop()
Comments