import sys import os import json import requests import time from datetime import datetime from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QHBoxLayout, QFrame, QPushButton, QGridLayout from PyQt5.QtGui import QPixmap, QPalette, QBrush from PyQt5.QtCore import Qt, QTimer, QDateTime from mfrc522 import SimpleMFRC522 import RPi.GPIO as GPIO GPIO.setwarnings(False) class KartOkumaSistemi(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Kart Okuma Sistemi") self.setWindowFlags(Qt.FramelessWindowHint) self.showFullScreen() # Program tam ekran modunda başlar self.setFocusPolicy(Qt.StrongFocus) self.setFocus() # GPIO ayarları self.buzzer_pin = 17 # Buzzer için GPIO pinini tanımlayın GPIO.setmode(GPIO.BCM) GPIO.setup(self.buzzer_pin, GPIO.OUT) # Arka plan self.set_background("placeholder_background.jpg") # Varsayılan arka plan self.fetch_background() # Üst kısım: Saat self.time_label = QLabel("", self) self.time_label.setAlignment(Qt.AlignRight) self.time_label.setStyleSheet("font-size: 18px; color: white; padding: 10px;") header_layout = QHBoxLayout() header_layout.addWidget(self.time_label) # Ana etiketler self.kart_bilgi_label = QLabel("Lütfen kartınızı okutunuz...", self) self.kart_bilgi_label.setAlignment(Qt.AlignCenter) self.kart_bilgi_label.setStyleSheet("font-size: 18px; font-weight: bold; color: white;") # Kart bilgileri çerçevesi self.card_frame = QFrame(self) self.card_frame.setStyleSheet( """ border: 2px solid white; border-radius: 10px; padding: 15px; background-color: rgba(0, 0, 0, 0.6); """ ) self.card_frame.setFixedSize(400, 300) # Profil görseli self.profile_image_label = QLabel(self.card_frame) self.profile_image_label.setFixedSize(80, 80) self.profile_image_label.setStyleSheet( """ border-radius: 40px; border: 2px solid white; """ ) self.profile_image_label.setAlignment(Qt.AlignCenter) # Bilgi alanları self.isim_label = QLabel("İsim: -", self.card_frame) self.birim_label = QLabel("Birim: -", self.card_frame) self.kart_id_label = QLabel("Kart ID: -", self.card_frame) self.giris_saati_label = QLabel("Giriş Saati: -", self.card_frame) # Çerçeve içi düzenleme card_layout = QVBoxLayout(self.card_frame) card_layout.addWidget(self.profile_image_label, alignment=Qt.AlignCenter) for label in [self.isim_label, self.birim_label, self.kart_id_label, self.giris_saati_label]: label.setStyleSheet("font-size: 14px; color: white;") card_layout.addWidget(label) # Çıkış butonu self.exit_button = QPushButton("Çıkış", self) self.exit_button.setStyleSheet( """ QPushButton { font-size: 16px; font-weight: bold; color: white; background-color: red; border: none; border-radius: 5px; padding: 10px 20px; } QPushButton:hover { background-color: darkred; } """ ) self.exit_button.clicked.connect(self.close) # Ana yerleşim düzeni main_layout = QGridLayout() main_layout.addLayout(header_layout, 0, 0, 1, 2) main_layout.addWidget(self.kart_bilgi_label, 1, 0, 1, 2) main_layout.addWidget(self.card_frame, 2, 0, 1, 2, alignment=Qt.AlignCenter) main_layout.addWidget(self.exit_button, 3, 1, alignment=Qt.AlignBottom | Qt.AlignRight) main_layout.setContentsMargins(10, 10, 10, 10) self.setLayout(main_layout) # Zamanlayıcılar self.clock_timer = QTimer() self.clock_timer.timeout.connect(self.update_time) self.clock_timer.start(1000) # Kart okuma sistemi self.reader = SimpleMFRC522() self.giris_saati = None self.kart_okuma_timer = QTimer() self.kart_okuma_timer.timeout.connect(self.kart_okuma) self.kart_okuma_timer.start(2000) # Her 2 saniyede bir kart kontrolü # Kart bilgilerini temizleme zamanlayıcısı self.clear_timer = QTimer() self.clear_timer.setSingleShot(True) self.clear_timer.timeout.connect(self.temizle_ekran) def set_background(self, image_path): """Arka planı ayarla.""" palette = QPalette() pixmap = QPixmap(image_path).scaled(self.size(), Qt.KeepAspectRatioByExpanding) palette.setBrush(QPalette.Background, QBrush(pixmap)) self.setPalette(palette) def fetch_background(self): """Arka plan görselini API'den çek.""" api_url = "https://pkds.damargrup.com/api/background" try: response = requests.get(api_url) if response.status_code == 200: with open("background.jpg", "wb") as f: f.write(response.content) self.set_background("background.jpg") except requests.exceptions.RequestException as e: print("Arka plan API hatası:", e) def update_time(self): """Saati güncelle.""" current_time = QDateTime.currentDateTime().toString("hh:mm:ss") self.time_label.setText(current_time) def kart_okuma(self): """Kart okuma işlemini gerçekleştir.""" try: id, veri = self.reader.read() mevcut_zaman = datetime.now().strftime("%Y-%m-%d %H:%M:%S") try: isim, birim = veri.split("-", 1) except ValueError: isim = veri birim = "Birim bilgisi yok" self.isim_label.setText(f"İsim: {isim}") self.birim_label.setText(f"Birim: {birim}") self.kart_id_label.setText(f"Kart ID: {id}") self.giris_saati_label.setText(f"Giriş Saati: {mevcut_zaman}") # Buzzer ile ses çıkar self.buzzer_beep() print(f"Kart okundu: {id}, {isim}, {birim}") self.clear_timer.start(10000) # 10 saniye sonra ekranı temizle except Exception as e: print("Kart okuma hatası:", e) def buzzer_beep(self): """Buzzer'ı 0.2 saniye çalıştır.""" GPIO.output(self.buzzer_pin, GPIO.HIGH) time.sleep(0.2) GPIO.output(self.buzzer_pin, GPIO.LOW) def temizle_ekran(self): """Bilgileri temizle ve varsayılan yazıyı göster.""" self.profile_image_label.clear() self.isim_label.setText("İsim: -") self.birim_label.setText("Birim: -") self.kart_id_label.setText("Kart ID: -") self.giris_saati_label.setText("Giriş Saati: -") self.kart_bilgi_label.setText("Lütfen kartınızı okutunuz...") def closeEvent(self, event): """Program kapanırken GPIO temizle.""" GPIO.cleanup() event.accept() if __name__ == "__main__": app = QApplication(sys.argv) sistem = KartOkumaSistemi() sistem.show() sys.exit(app.exec_())