Bonjour, je souhaite réaliser une machine a photo en python… j’aimerai pouvoir prendre une photo à l’aide d’un bouton poussoir relié par GPIO.
- Mon programme sans le bouton fonctionne, l’application s’ouvre et je peux prendre des photos avec les boutons de l’IHM.
- Mon programme avec le bouton fonctionne aussi, je peux prendre des photos en appuyant sur le BP.
MAIS, les deux ensembles ne fonctionnent pas, lorsque mon code pour le BP est actif, cela supprime mon IHM (ou en tout cas je ne la vois pas)…
Savez-vous comment faire pour régler ce problème afin que je puisse piloter mon IHM avec mes BP en GPIO ?
mon code (le morceau de programme pour le BP se trouve l.140):
from tkinter import *
from tkinter import font
from picamera import PiCamera
import time
from time import sleep
from PIL import Image, ImageTk
import os
import RPi.GPIO as GPIO
#####from pynput import keyboard
""" +VARIABLES+ """
camera = PiCamera()
path = '/home/pi/Desktop/Python/Projet/Photos/Photo' #chemin d'accès photos (fait parti du nom) //à modifier si chemin différent
count = 2 #compteur qui permet de limiter le temps de prise de la photo en secondes
camera.resolution = (1920,1080) #personnalisation de la camera (FULL HD)
camera.framerate = 60 #personnalisation de la camera (60fps)
pinBtn = 2 # Definition des pins bouton
pinLedV = 16 # Definition des pins led
pinLedB = 21 # Definition des pins led
channel = 2
""" -VARIABLES- """
""" +GPIO+ """
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# Definition des pins en entree / sortie
GPIO.setup(pinBtn, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(pinLedV, GPIO.OUT)
GPIO.setup(pinLedB, GPIO.OUT)
GPIO.setup(channel, GPIO.IN)
""" -GPIO- """
""" +FONCTION+ """
###fonction horloge
def digital_clock():
time_live = time.strftime("%H:%M:%S")
horloge.config(text=time_live)
horloge.after(500, digital_clock) #actualisation toutes les 500ms
###fonction camera
def take_a_photo():
dateiso = time.strftime("%Y-%m-%d_%H-%M-%S") #date/heure (locale) de la photo
GPIO.output(21,True)
camera.start_preview(fullscreen = False, window = (0,196,1280,720)) #permet de placer manuellement la frame du flux vidéo
countdown(count) #appel de la fonction countdown
camera.capture(path+'_'+dateiso+'.jpeg')
photo_name = (path+'_'+dateiso+'.jpeg')
photo_button.grid_forget()
maphoto = Image.open(path+'_'+dateiso+'.jpeg')
maphoto = maphoto.resize((1280,720))
photo = ImageTk.PhotoImage(maphoto)
photo_label.config(image = photo)
photo_label.image = photo
camera.stop_preview()
GPIO.output(21,False)
print (photo_name)
comment_label.config(text='Souhaitez-vous imprimer cette photo ?')
print_a_photo() #appel de la fonction print_a_photo
###fonction décompte
def countdown(count):
while count:
mins, secs = divmod(count, 60)
timer = '{:d}'.format(secs)
print(timer, end="\r")
time.sleep(1)
count -= 1
def print_a_photo():
print_frame.grid(row=2, column=0)
YES_button.grid(row=0, column=0, padx=20)
NO_button.grid(row=0, column=1, padx=20)
def back_to_photo():
print_frame.grid_forget()
YES_button.grid_forget()
NO_button.grid_forget()
photo_button.grid(row=2, column=0)
def enable_flash_light():
GPIO.output(16,True)
def disable_flash_light():
GPIO.output(16,False)
def my_callback(channel):
print("> FLUX VIDEO OUVERT")
dateiso = time.strftime("%Y-%m-%d_%H-%M-%S") #date/heure (locale) de la photo
GPIO.output(21,True)
camera.start_preview(fullscreen = False, window = (0,196,1280,720)) #permet de placer manuellement la frame du flux vidéo
countdown(count) #appel de la fonction countdown
camera.capture(path+'_'+dateiso+'.jpeg')
photo_name = (path+'_'+dateiso+'.jpeg')
camera.stop_preview()
GPIO.output(21,False)
print (photo_name)
""" -FONCTION- """
""" +CREATION+ """
mainWindow = Tk() #creation mainWindow
title_frame = Frame(mainWindow, width=350, height=200, bg='black') #creation frame pour contenir le titre
frame = Frame(mainWindow, width=550, height=400, bg='black') #creation frame pour contenir le reste
print_frame = Frame(frame, bg='black') #creation frame pour boutons d'impression
flash_frame = Frame(mainWindow, bg='black')#creation frame pour activer/desactiver flash light
""" -CREATION- """
###personnalisation de la fenetre
mainWindow.title("SelfIN")
mainWindow.config(background='black')
mainWindow.attributes('-fullscreen', True) #application en plein écranS
mainWindow.bind('<F>',lambda e: mainWindow.destroy()) #pour enlever le plein écran et quitter
###ajout texte
Self = Label(title_frame, text=("Self"), font=("koliko-Bold.ttf", 60), bg='black',fg='white')
IN = Label(title_frame, text=("IN"), font=("koliko-Bold.ttf", 60), bg='black',fg='gold')
###ajout commentaires
comment_label = Label(frame, font=("koliko-Bold.ttf", 20), bg='black', fg='white')
###ajout bouton photo
photo_button = Button(frame, text="Prendre une photo", font=("koliko-Bold.ttf", 20), bg='gold', fg='black', command=take_a_photo)
YES_button = Button(print_frame, text="Oui", font=("koliko-Bold.ttf", 20), bg='green', fg='white')
NO_button = Button(print_frame, text="Non", font=("koliko-Bold.ttf", 20), bg='red', fg='white', command=back_to_photo)
enable_flash_button = Button(flash_frame, text="EF", font=("koliko-Bold.ttf", 8), bg='grey', fg='black', command=enable_flash_light)
disable_flash_button = Button(flash_frame, text="DF", font=("koliko-Bold.ttf", 8), bg='grey', fg='black', command=disable_flash_light)
###ajout photo
maphoto = Image.open("Images/base_background.png") #Chargement d'une image à partir de PIL
maphoto = maphoto.resize((1280,720))
photo = ImageTk.PhotoImage(maphoto) #Création d'une image compatible Tkinter
photo_label = Label(frame, image=photo, width = 1280, height = 720, borderwidth=0)
photo_label.image = photo #Maintient en vie de photo dans un objet non détruit
###ajout horloge
horloge = Label(mainWindow, font="koliko-Bold.ttf", bg='black', fg='white')
#ici on ajoute une tempo de 500ms ms pour eviter l'effet rebond
GPIO.add_event_detect(channel, GPIO.FALLING, callback=my_callback, bouncetime=500)
# Boucle infinie
while True:
etat = GPIO.input(pinBtn)
# etat==0 => bouton appuye => LED allumee
if (etat == 0) :
#print("Appui detecte")
GPIO.output(16,True)
else :
GPIO.output(16, False)
# Temps de repos pour eviter la surchauffe du processeur
#time.sleep(0.3)
""" +PLACEMENT+ """
title_frame.pack(expand=True)
Self.grid(row=0, column=0)
IN.grid(row=0, column=1)
horloge.pack()
frame.pack(expand=True)
photo_label.grid(row=0, column=0)
comment_label.grid(row=1, column=0)
photo_button.grid(row=2, column=0)
""""""
flash_frame.pack(expand=True)
enable_flash_button.grid(row=0, column=0)
disable_flash_button.grid(row=0, column=1)
""""""
print_frame.grid_forget()
YES_button.grid_forget()
NO_button.grid_forget()
""" -PLACEMENT- """
""" -FONCTION PRINCIPALE- """
digital_clock() #horloge
mainWindow.mainloop() #fonction principale application
""" -FONCTION PRINCIPALE- """
+0
-0