import os import time from PIL import Image import pygame import threading from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # Chemin vers le dossier contenant les images IMAGE_DIR = './photos' # Initialisation de Pygame pygame.init() pygame.display.set_caption("Diaporama") screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # Créez une nouvelle surface pour dessiner les images et les logos intermediate_surface = pygame.Surface(screen.get_size()) # Logos Play, Pause, Next, Previous LOGO_SIZE = (200, 200) pause_logo = pygame.image.load("./logos/pause.png") pause_logo = pygame.transform.smoothscale(pause_logo, LOGO_SIZE) pause_logo_rect = pause_logo.get_rect(center=screen.get_rect().center) play_logo = pygame.image.load("./logos/play.png") play_logo = pygame.transform.smoothscale(play_logo, LOGO_SIZE) play_logo_rect = play_logo.get_rect(center=screen.get_rect().center) next_logo = pygame.image.load("./logos/next.png") next_logo = pygame.transform.smoothscale(next_logo, LOGO_SIZE) next_logo_rect = next_logo.get_rect(midright=(screen.get_rect().right - 200, screen.get_rect().centery)) previous_logo = pygame.image.load("./logos/previous.png") previous_logo = pygame.transform.smoothscale(previous_logo, LOGO_SIZE) previous_logo_rect = previous_logo.get_rect(midleft=(screen.get_rect().left + 200, screen.get_rect().centery)) # Chargement des images dans une liste images = [] # Fonction pour charger une image en utilisant un thread def load_image(local_image_path): with Image.open(local_image_path) as img: img.thumbnail(screen.get_size()) images.append(pygame.image.fromstring(img.tobytes(), img.size, "RGB")) # Création des threads pour charger les images image_threads = [] for file_name in os.listdir(IMAGE_DIR): if file_name.endswith('.jpg') or file_name.endswith('.png'): image_path = os.path.join(IMAGE_DIR, file_name) image_thread = threading.Thread(target=load_image, args=(image_path,)) image_threads.append(image_thread) image_thread.start() # Attente de la fin du chargement de toutes les images for image_thread in image_threads: image_thread.join() class ImageHandler(FileSystemEventHandler): def on_modified(self, local_event): if local_event.src_path.endswith('.jpg') or local_event.src_path.endswith('.png'): load_image(local_event.src_path) def watch_images_directory(): event_handler = ImageHandler() observer = Observer() observer.schedule(event_handler, IMAGE_DIR, recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() watch_thread = threading.Thread(target=watch_images_directory) watch_thread.daemon = True watch_thread.start() # Définition des zones d'affichage screen_width, screen_height = screen.get_size() left_rect = pygame.Rect(0, 0, screen_width // 3, screen_height) center_rect = pygame.Rect(screen_width // 3, 0, screen_width // 3, screen_height) right_rect = pygame.Rect(screen_width * 2 // 3, 0, screen_width // 3, screen_height) # Variables pour le diaporama current_image_index = 0 next_image_time = pygame.time.get_ticks() + 5000 is_paused = False image = images[current_image_index] image_rect = image.get_rect(center=screen.get_rect().center) # Boucle principale running = True while running: # Gestion des événements Pygame for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False elif event.key == pygame.K_LEFT: current_image_index = (current_image_index - 1) % len(images) next_image_time = pygame.time.get_ticks() + 5000 screen.blit(previous_logo, previous_logo_rect) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) elif event.key == pygame.K_RIGHT: screen.blit(next_logo, next_logo_rect) current_image_index = (current_image_index + 1) % len(images) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) next_image_time = pygame.time.get_ticks() + 5000 elif event.key == pygame.K_SPACE: is_paused = not is_paused if is_paused: screen.blit(pause_logo, pause_logo_rect) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) else: screen.blit(play_logo, play_logo_rect) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) elif event.type == pygame.MOUSEBUTTONUP: pos = pygame.mouse.get_pos() if left_rect.collidepoint(pos): current_image_index = (current_image_index - 1) % len(images) next_image_time = pygame.time.get_ticks() + 5000 screen.blit(previous_logo, previous_logo_rect) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) previous_image_time = pygame.time.get_ticks() + 5000 elif center_rect.collidepoint(pos): is_paused = not is_paused if is_paused: screen.blit(pause_logo, pause_logo_rect) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) else: screen.blit(play_logo, play_logo_rect) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) elif right_rect.collidepoint(pos): screen.blit(next_logo, next_logo_rect) current_image_index = (current_image_index + 1) % len(images) pygame.display.flip() pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo screen.fill((0, 0, 0)) next_image_time = pygame.time.get_ticks() + 5000 image = images[current_image_index] image_rect = image.get_rect(center=screen.get_rect().center) # Dessinez l'image actuelle sur la surface intermédiaire intermediate_surface.fill((0, 0, 0)) intermediate_surface.blit(image, image_rect) # Dessinez la surface intermédiaire sur l'écran screen.blit(intermediate_surface, (0, 0)) pygame.display.flip() if not is_paused and pygame.time.get_ticks() >= next_image_time: current_image_index = (current_image_index + 1) % len(images) next_image_time = pygame.time.get_ticks() + 5000 # Fermeture de Pygame pygame.quit()