Aide creer une interface pour mon code python

j’ai juste modifie l’incrémentation et il manquait un « . » avant un jpg et un autre truc mais sinon niquel
voila ce que j’ai pour l’instant, avec mon probleme de photo qui s’affiche qu’une demi sec:

[code]#!/usr/bin/env python2.7

-- coding: utf-8 -

import RPi.GPIO as GPIO
import time
from datetime import datetime
from PIL import Image
import pygame
from pygame.locals import *
import os

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

PHOTOS = « /home/pi/Desktop/photos »
APP_RESSOURCES = « /home/pi/Desktop/ressources »
imageName_accueil = « %s/accueil.jpg » %APP_RESSOURCES
imageName_compteur_3 = « %s/compteur3.jpg » % APP_RESSOURCES
imageName_compteur_2 = « %s/compteur2.jpg » % APP_RESSOURCES
imageName_compteur_1 = « %s/compteur1.jpg » % APP_RESSOURCES
imageName_souriez = « %s/souriez.jpg » % APP_RESSOURCES

pygame.init()
screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
width, height = screen.get_size()

def takepic(imageName): #prend une photo (note: il faut selectionner la ligne qui correspond à votre installation en enlevant le premier # )
command = « sudo raspistill -t 1000 -w 960 -h 720 -o « + imageName + » -q 80 » #prend une photo
# command = « sudo raspistill -t 1000 -w 960 -h 720 -o « + imageName + » -rot 90 -q 80 » #prend une photo et la tourne de 90°
# command = « sudo raspistill -t 1000 -w 960 -h 720 -o « + imageName + » -rot 180 -q 80 » #prend une photo et la tourne de 180°
# command = « sudo raspistill -t 1000 -w 960 -h 720 -o « + imageName + » -rot 270 -q 80 » #prend une photo et la tourne de 270°
os.system(command)

def loadpic(imageName): # affiche imagename
print("loading image: " + imageName)
background = pygame.image.load(imageName);
background.convert_alpha()
background = pygame.transform.scale(background,(width,height))
screen.blit(background,(0,0),(0,0,width,height))
pygame.display.flip()

def minuterie():
#writemessage(" 3")
loadpic(imageName_compteur_3)
time.sleep(1)
#writemessage(" 2")
loadpic(imageName_compteur_2)
time.sleep(1)
#writemessage(" 1")
loadpic(imageName_compteur_1)
time.sleep(1)
#writemessage(« souriez »)
loadpic(imageName_souriez)

def writemessage(message): # pour pouvoir afficher des messages sur un font noir
screen.fill(pygame.Color(0,0,0))
font = pygame.font.SysFont(« verdana », 250, bold=1)
textsurface = font.render(message, 1, pygame.Color(255,255,255))
screen.blit(textsurface,(35,40))
pygame.display.update()

def writemessagetransparent(message): # pour pouvoir afficher des messages en conservant le font
font = pygame.font.SysFont(« verdana », 50, bold=1)
textsurface = font.render(message, 1, pygame.Color(255,255,255))
screen.blit(textsurface,(35,40))
pygame.display.update()

if name == ‹ main ›:
if (os.path.isdir(PHOTOS) == False): # si le dossier pour stocker les photos n’existe pas
os.mkdir(PHOTOS) # alors on crée le dossier (sur le bureau)
os.chmod(PHOTOS,0o777) # et on change les droits pour pouvoir effacer des photos

while True : #boucle jusqu’a interruption
try:
loadpic(imageName_accueil)

#on attend que le bouton soit pressé
    GPIO.wait_for_edge(18, GPIO.FALLING)
# on a appuyé sur le bouton...

#on lance le decompte
    minuterie()

#on genere le nom de la photo avec heure_min_sec
    date_today = datetime.now()
    nom_image = date_today.strftime('%d_%m_%H_%M_%S')

#on prend la photo
    chemin_photo = "%s/%s.jpeg" % (PHOTOS,nom_image)
    takepic(chemin_photo) #on prend la photo 

#on affiche la photo
    loadpic(chemin_photo)
    
    if (GPIO.input(18) == 0): #si le bouton est encore enfoncé (sont etat sera 0)
  		      print("bouton  appuye, je dois repartir au début de ma boucle")
  		      continue # alors on sort du while

except KeyboardInterrupt:
print ‹ sortie du programme! ›
raise

GPIO.cleanup() # reinitialisation GPIO lors d’une sortie normale[/code]

tres bonne idée pour le décompte transparent… euh je fais ça comment?
Désolé si j’en demande trop mais j’ai plus avancé en 10 min qu’en 15 jours ou personne ne me répondait sur différents forums.

OK par contre il faudrait remplacer le ‹ continue › dans la boucle while par break , car c’est le bouton pour « casser (break en anglais) » la boucle (sortir de la boucle) et donc arrêter l’application lors du maintien bouton.Continu veut dire retour au début de la boucle , donc la l’application ne se termine pas lors du maintien je me trompe?

Pour la transparence il faut utiliser un fichier image au format PNG et donc créer une image avec fond transparent , puis par exemple, en plein milieu ajouter un chiffre 2 (qui au passage peut être créé programmatiquement) et enregistrer ,… au format PNG puis il faut regarder du coté de pygame comment ajouter un arriere plan sur toute l’image et lui donner un alpha et par dessus charger l’image du chiffre 2 . Je vois background.convert_alpha() dans le code fourni , donc je pense que c’est faisable.

Je ne connais pas la librairie pygame donc je ne peux pas vous sortir le code mais laissez moi un peu de temps je vais regarder ça .

Pour l’image transparente photoshop fera l’affaire.

je viens de tester avec break
l’appli se fige sur ma photo et ne repars pas au debut
je suis oblige de reboot le raspberry

Le break est bien indenté ? il doit être dans le scope du ‹ if › pour être effectif que lors de l’appui bouton

if __name__ == '__main__':
if (os.path.isdir(PHOTOS) == False): # si le dossier pour stocker les photos n'existe pas
	os.mkdir(PHOTOS) # alors on crée le dossier (sur le bureau)
	os.chmod(PHOTOS,0o777) # et on change les droits pour pouvoir effacer des photos

while True : #boucle jusqu'a interruption
	try:

		loadpic(imageName_accueil)


		print "\n attente boucle"

		#on attend que le bouton soit pressé
		GPIO.wait_for_edge(18, GPIO.FALLING)
		# on a appuyé sur le bouton...


		#on lance le decompte
		minuterie()


		#on genere le nom de la photo avec heure_min_sec
		date_today = datetime.now()
		nom_image = date_today.strftime('%d_%m_%H_%M_%S')

		#on prend la photo
		chemin_photo = "%s/%s.jpeg" % (PHOTOS,nom_image)
		takepic(chemin_photo) #on prend la photo 

		#on affiche la photo
		loadpic(chemin_photo)
	
		#on affiche un message
		writemessagetransparent("et voila...")

		if (GPIO.input(18) == 0): #si le bouton est encore enfoncé (sont etat sera 0)
  				print("bouton  appuye, je dois sortir de ma boucle")
  				break # quitter la boucle , gpio cleanup ...
		else # J'attend 5 secondes avent de repartir au début de l'application
		      time.sleep(5) # attendre 5 secondes avant retour accueil
	except KeyboardInterrupt:
		print 'sortie du programme!'
		raise

GPIO.cleanup() # reinitialisation GPIO lors d'une sortie normale

Je pense savoir pourquoi, il faut faire un ‹ reset › de l’instance de pygame:

screen.blit(background, (0,0)) …

mais il faut le placer au bon endroit et donc la il faut modifier le code et en faire une classe pour que cela soit plus simplepour le dev car il y a des mofifes à faire.

Si votre appui bouton prolongé arrête actuellement le script , je n’y comprend plus rien, car ce n’est pas possible avec un continue de sortir de la boucle et donc pour le coup stopper l’app.

super ça marche!!! vraiment merci!
je viens de faire sous photoshop mon décompte sur fond transparent avec les chiffres ecrit en blanc
comme ca au cas ou si tu as la soluce pour avoir l’image de ma camera en arriere plan.

et sinon il y a un petit truc pas tres beau, quand il prend la photo il l’affiche pas en plein écran du coup je vois mon image de « prenez la pose » en arriere plan
par contre juste apres il m’affiche bien ma photo en fullscreen pendant 5 sec.
C’est uniquement la seconde ou il prend la photo ou on voit l’ecran d’avant en arriere plan.

Ok je regarde du coté de pygame pour l’image transparente.
Aussi pour le ‹ bug › d’affichage (c’est normal, car on ajoute des objets python (ici une image) et on ne l’enleve jamais , voilà pourquoi ma réflexion dans mon post précédent) Il faut appeler : screen.blit(background, (0,0)), mais background est créé uniquement dans la fonction loadpic … laissez moi quelques minutes je regarde tout ça.

Si vous voulez essayer ceci et me dire si cela corrige le bug d’affichage (je réfléchis maintenant à l’opacité pour le retour de la cam en background) :

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*
import RPi.GPIO as GPIO
import time
from datetime import datetime
from PIL import Image
import pygame
from pygame.locals import *
import os


# GPIO INIT
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# PYGAME INIT
pygame.init()
screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
width, height = screen.get_size()

# PERSONNAL CONFIGURATION
PHOTOS                      = "/home/pi/Desktop/photos"
APP_RESSOURCES              = "/home/pi/Desktop/ressources"

imageName_accueil           = "%s/accueil.jpg"   % APP_RESSOURCES
imageName_compteur_3        = "%s/compteur3.jpg" % APP_RESSOURCES
imageName_compteur_2        = "%s/compteur2.jpg" % APP_RESSOURCES
imageName_compteur_1        = "%s/compteur1.jpg" % APP_RESSOURCES
imageName_souriez           = "%s/souriez.jpg"   % APP_RESSOURCES

ATTENTE_RETOUR_ACCUEIL      = 5 # secondes


# GLOBAL VARIABLE FOR ACCESS IN ALL SCOPE
global background,textsurface

def takepic(imageName): #prend une photo (note: il faut selectionner la ligne qui correspond à votre installation en enlevant le premier # )
    command = "sudo raspistill -t 1000 -w 960 -h 720 -o "+ imageName +" -q 80" #prend une photo
    # command = "sudo raspistill -t 1000 -w 960 -h 720 -o "+ imageName +" -rot 90 -q 80" #prend une photo et la tourne de 90°
    # command = "sudo raspistill -t 1000 -w 960 -h 720 -o "+ imageName +" -rot 180 -q 80" #prend une photo et la tourne de 180°
    # command = "sudo raspistill -t 1000 -w 960 -h 720 -o "+ imageName +" -rot 270 -q 80" #prend une photo et la tourne de 270°
    os.system(command)
def loadpic(imageName): # affiche imagename
	global background
    print("loading image: " + imageName)
    background = pygame.image.load(imageName);
    background.convert_alpha()
    background = pygame.transform.scale(background,(width,height))
    screen.blit(background,(0,0),(0,0,width,height))
    pygame.display.flip()
def minuterie():
  #writemessage(" 3")
  loadpic(imageName_compteur_3)
  time.sleep(1)
  #writemessage(" 2")
  loadpic(imageName_compteur_2)
  time.sleep(1)
  #writemessage(" 1")
  loadpic(imageName_compteur_1)
  time.sleep(1)
  #writemessage("souriez")
  loadpic(imageName_souriez)
def writemessage(message): # pour pouvoir afficher des messages sur un font noir
	global textsurface
    screen.fill(pygame.Color(0,0,0))
    font = pygame.font.SysFont("verdana", 250, bold=1)
    textsurface = font.render(message, 1, pygame.Color(255,255,255))
    screen.blit(textsurface,(35,40))
    pygame.display.update()
def writemessagetransparent(message): # pour pouvoir afficher des messages en conservant le font
	global textsurface
    font = pygame.font.SysFont("verdana", 50, bold=1)
    textsurface = font.render(message, 1, pygame.Color(255,255,255))
    screen.blit(textsurface,(35,40))
    pygame.display.update()

def cleanScreenPyGameElements():
	global background,textsurface
	screen.blit(background, (0,0))
	screen.blit(textsurface, (0,0))
	pygame.display.update()



if __name__ == '__main__':
        if (os.path.isdir(PHOTOS) == False): # si le dossier pour stocker les photos n'existe pas
           os.mkdir(PHOTOS) # alors on crée le dossier (sur le bureau)
           os.chmod(PHOTOS,0o777) # et on change les droits pour pouvoir effacer des photos
		while True : #boucle jusqu'a interruption
		  try:
		        loadpic(imageName_accueil)
		    #on attend que le bouton soit pressé
		    GPIO.wait_for_edge(18, GPIO.FALLING)
			# on a appuyé sur le bouton...

			#on lance le decompte
		    minuterie()

			#on genere le nom de la photo avec heure_min_sec
		    date_today = datetime.now()
		    nom_image = date_today.strftime('%d_%m_%H_%M_%S')

			#on prend la photo
		    chemin_photo = "%s/%s.jpeg" % (PHOTOS,nom_image)
		    
		    cleanScreenPyGameElements() # nettoyer les éléments créés avec python

		    takepic(chemin_photo) #on prend la photo 

			#on affiche la phot			
		    loadpic(chemin_photo)
		    
		    if (GPIO.input(18) == 0): #si le bouton est encore enfoncé (sont etat sera 0)
		  		      print("bouton  appuye, je dois repartir au début de ma boucle")
		  		      continue # alors on sort du while

		    time.sleep(ATTENTE_RETOUR_ACCUEIL)
		  except KeyboardInterrupt:
		    print 'sortie du programme!'
		    raise
		GPIO.cleanup() # reinitialisation GPIO lors d'une sortie normale

POur le décompte essayez avec vos images transparentes :

 imageName_accueil           = "%s/accueil.png"   % APP_RESSOURCES
imageName_compteur_3        = "%s/compteur3.png" % APP_RESSOURCES
imageName_compteur_2        = "%s/compteur2.png" % APP_RESSOURCES
imageName_compteur_1        = "%s/compteur1.png" % APP_RESSOURCES
imageName_souriez           = "%s/souriez.png"   % APP_RESSOURCES

oui super ça marchait pas avant mais forcément j’avais change les images en png et je ne l’avais pas fait dans le script

merci infiniment pour la super aide :wink:

Derien content d’avoir aidé. DOnc tout est fonctionnel la ? il y a un retour cam derriere le minuteur ?

pas encore testé, ma future femme veux plutot des photos type cadre avec le décompte dedans… je teste et si ça lui plait pas : transparent

Je vois l’idée, c’est sympa je trouve. Pour le retour cam derriere par exemple la zone blanche de votre image ci-dessus (à la place de la main et de l’appareil photo) il faut gommer cette zone pour qu’elle soit transparente (outils gomme, mais je pense que vous connaissez photoshop) , donc ceci sera l’image de premier plan. En en arrière plan il faut le retour cam, flux vidéo , on est d’accord ? Pour cela votre cam doit être en train de lire le flux (logique, pour vous l’afficher…) et pour cela ca se passe avec : pygame.camera. Je suis en train de vous faire un pseudo code …

merci oui c’est ce que je voulais faire si ca lui plait pas un coup de gomme pour rendre transparent

Pas de quoi, dans le coup ca va être compliqué pour le retour vidéo en arrière plan … passer de temps en temps par ici si vous n’avez pas trouvé de réponse ou de solution , j’essaierai de voir ce que je peux faire… mais la j’ai pas de code sous la main ca va prendre trop de temps pour aujourd’hui.dsl

vous tracassez pas, vous m’avez deja aidé énormément!
J’étais au point mort!
Je vais me passer du retour vidéo au pire ma copine aime bien les cadres

Bonjour Kevin,

as tu pu avancer sur ton projet ?
je suis également entrain de travaillé sur un projet similaire, en partant de la base de programme trouvé sur FabLab.

je cherche a intégrer un calque/masque sur la photo prise (avec le logo de notre mariage en bas à gauche de photo)
mais je ne trouve pas de solution…
j’ai créé mon logo en .png

si quelqu’un peu m’aider :slight_smile:

bonjours a tous!

j’espère trouver encore une personne qui pourrait m’aider…

Ce poste m’a beaucoup aider sur l’avancée de mon photobooth tout comme Kevin!
plus de progrès en 10minutes quand 10 jours =)

mais la qualité de la caméra pi ne me plaît pas !

j’ai donc trouvé gphoto2 qui déclenche mon nikon D5300 grâce a la commande « gphot2 --trigger-capture ».
en suivant cette video [Raspberry Pi Tutorial 41: Control a DSLR with your Pi! - YouTube]

Ma question:
est-ce possible d’intégrer « cette commande » sur ce même programme de photobooth a la place de la caméra pi?

Merci d’avance!