Étape 3: Écrire les programmes Python
J’ai commencé la programmation en mettant l’accent sur l’obtention d’un système d’écran tactile interactif simple utilisant Tkinter pour la plupart des objets pour créer un python GUI. Tout le code est inclus d’avoir un kiosque style photobooth. Le code est inclus dans un fichier zip dans ce instructable. Après avoir exécuté ce pendant plusieurs jours, j’ai eu quelques petits changements que j’ai rectifié dans le fichier zip de téléchargement et dans ces exemples.
Le projet se compose de trois grands programmes :
- christmas_motion.py - c’est ce que je démarre au démarrage de la PI, il surveille le détecteur de mouvement et quand le mouvement est détecté il vérifie si un fichier existant n’est que là lors de l’exécution du programme principal « christmas_wreath_2.0.py ». Si le fichier est là il ne fait rien, si ce n’est pas alors le programme du mouvement débute le programme principal « christmas_wreath_2.0.py »
- Actions principales :
- Moniteur Motion
- Le coup d’envoi christmas_wreath_2.0.py
- Fermez l’écran de veille « feh »
- Actions principales :
- christmas_wreath_2.0.py - c’est le programme principal, il fait quatre choses :
- Demander au visiteur de votre porte, s’ils veulent prendre une photo « Elfie »
- Prendre / reprendre des photos
- Imprimer
- Cesser de fumer
- christmas_nowprinting.py - ceci est utilisé pour afficher une image GIF animée d’une imprimante. Étant donné que l’imprimante est bluetooth le travail d’impression prend environ deux minutes pour terminer. Après cela, le fichier empêchant le programme du mouvement depuis le coup d’envoi d’un nouveau programme « Take Elfie » (christmas_wreat_2.0.py"est supprimé et notre traitement se poursuit.
Code:
christmas_motion.py
christmas_wreath_2.0.py
#! / usr/bin/env pythonimport osfrom temps importation sommeil import tkFont de Tkinter import * importation Tkinter comme tk de ImageWin importation Dib, HWND d’importation PIL PIL Image importer ImageTk d’importation sous-processus Popen import shutil import os.pathimport temps #from SimpleCV import Imageimport picameraclass App: def __init__ (self, maître): self.counter = 0 im = Image.open("/home/pi/Pictures/christmasbg1.jpg") redimensionné = im.resize ((340, 240) Image.ANTIALIAS) tkimage = ImageTk.PhotoImage(resized) myvar = Label (cadre, image = tkimage, bg = "black", texte = "", composé = tk. BAS, font = btnFont, fg = "blanc") myvar.image = tkimage myvar.grid(row=1,column=0,sticky=N+S+E+W) ## remarquez, n’utilisez pas button.pack ni button.grid interchangeable - grille forces boutons dans les emplacements de ligne/colonne, vous spécifiez ## pack permet au système de tkinter déterminer ce qui devrait fonctionner mieux self.button1 = bouton (frame, secours = FLAT, bg = "red", activebackground = "blanc", au premier plan = "silver", texte = "Non merci, \n Merry Christmas" police = btnFont, command=self.quit_pressed) self.button1.grid(row=1,column=1,sticky=N+S+E+W) #self.button1.pack(fill=BOTH,expand=1) self.button2 = bouton (frame, secours = FLAT, bg = "vert", activebackground = "red", au premier plan = "silver", texte = "Take 'Elfie'?", polices = btnFont, command=self.pi_picture) self.button2.grid(row=0,column=0,sticky=N+S+E+W) #self.button2.pack(fill=BOTH,expand=1) #SHOW ELFIE BUTTON - vierge jusqu'à ce qu’ELFIE TAKEN self.button4 = bouton (cadre secours = FLAT, bg = "vert", activebackground = "red", au premier plan = "silver", police = btnFont, état = DISABLED, command=self.show_elfie) self.button4.grid(row=0,column=1,sticky=N+S+E+W) #self.button4.pack(fill=BOTH,expand=1) def show_elfie(self) : im = Image.open("/home/pi/Documents/pythonprograms/imagetest2.jpg") redimensionné = im.resize ((340, 240),Image.ANTIALIAS) tkimage = ImageTk.PhotoImage(resized) myvar = Label (cadre, image = tkimage, bg = "red", texte = "Your Elfie Preview", composé = tk. En bas, de la police = btnFont, fg = "blanc") myvar.image = tkimage self.button4["text"] = "imprimer Elfie? \nClick 'Take Elfie' de re-prendre" myvar.grid(row=1,column=0,sticky=N+S+E+W) def create_window(self) : self.counter += 1 t = Toplevel() center(t) t.title ("image ici") msg = Message (t, texte = "Mettre une photo ici") msg.pack() t.wm_title ("fenêtre #%s" % self.counter) im = Image.open("/home/pi/Pictures/christmasbg1.jpg") #tkroot = Tk() tkimage = ImageTk.PhotoImage(im) frame = Frame(relief=FLAT bg = "vert") frame.pack_propagate(0) frame.pack (remplissage = BOTH, développez = 1) frame.rowconfigure((0,1),weight=1) frame.columnconfigure((0,1),weight=1) Label(frame,image=tkimage).pack() bouton = bouton (image, texte = "Rejeter", command=t.destroy) button.pack() def quit_pressed(self) : proc = Popen (["feh -Y - x - q -D 5 -B noir -F -Z - z - r /home/pi/Pictures"], shell = True, stdin = None, stdout = None, stderr = None, close_fds = True) sleep(2) os.remove("christmas_wreath_placeholder.txt") #os.system ("feh -Y - x - q -D 5 -B noir -F -Z - quit() z - r /home/aaron/Pictures ») #This va tuer l’application elle-même, pas l’image de soi. def pi_picture(self) : avec picamera. PiCamera() comme caméra : camera.resolution=(1920,1080) #camera.exposure_mode="backlight" #camera.awb_mode="shade" camera.start_preview() sleep(4) global filepath filepath = "/ home/pi/Documents/pythonprograms/wreathpics /" filenamestring global filenamestring=time.strftime("%Y%m%d-%H%M%S") global lime lime = ".jpg" global filefullname filefullname = filepath + filenamestring + lime camera.capture(filefullname) camera.stop_preview() #sleep(2) im = Image.open(filefullname) redimensionné = im.resize ((340, 240),Image.ANTIALIAS) tkimage = ImageTk.PhotoImage(resized) myvar = Label (cadre , image = tkimage, bg = « red », texte = « Elfie Preview », composé = tk. BAS, font = btnFont, fg = "blanc") myvar.image = tkimage self.button2["text"] = "Re-prendre Elfie?" self.button4["text"] = "imprimer Elfie? "self.button4["state"]= self.button4["command "normal" "] = self.print_elfie myvar.grid(row=1,column=0,sticky=N+S+E+W) def print_elfie(self) : #setup imprimer trucs destdir =" / home/pi/Documents/pythonprograms/wreathpics/prints / "destpath = destdir + filenamestring + lime shutil.copy2(filefullname,destpath) obexftpstr =" sudo obexftp -b 00:04:48:10:0B:21--canal 1 -p "obexftpfull = obexftpstr + filefullname imprimer obexftpfull proc = Popen ([obexftpfull], shell = True, stdin = None, stdout = None stderr = None, close_fds = True) proc = Popen ([« python christmas_nowprinting.py »], shell = True, stdin = None, stdout = None, stderr = None, close_fds = True) sleep(1) #os.system ("feh -Y - x - q -D 5 -B noir -F -Z - z - r /home/aaron/Pictures ») quit() #This va tuer l’application elle-même, pas le frame.class libre ImageView(Frame) : def __init__(self,master,**options) : Frame.__init__ (self, maître ** options) self.dib = None self.bind("",self._expose) def setimage(self,image) : self.config(bg="") self.dib = Dib(image) self.event_generate("") def _expose(self,event) : si self.dib : self.dib.expose(HWDN(self.winfo_id())) def center(win): "" "centre une fenêtre tkinter : param victoire : la racine ou le Toplevel fenêtre vers le Centre" "" win.update_idletasks() largeur = win.winfo_width() frm_width = win.winfo_rootx() - win.winfo_x() win_width = largeur + 2 * hauteur frm_width = win.winfo_height() titlebar_height = win.winfo_rooty() - win.winfo_y() win_height = hauteur + titlebar_height + frm_width x = win.winfo_screenwidth() / / 2 - win_width / / 2 y = win.winfo_screenheight() / / 2 - win_height / / 2 win.geometry ('{} x {} + {} + {}'.format (largeur, hauteur, x, y)) win.deiconify () def close_after() : proc = Popen (["feh -Y - x - q -D 5 -B noir -F -Z - z - r /home/pi/Pictures »], shell = True, stdin = None, stdout = None, stderr = None, close_fds = True) sleep(2) os.remove("christmas_wreath_placeholder.txt") #os.system (" feh -Y - x - q -D 5 -B noir -F -Z - z - r /home/aaron/Pictures ») quit() #This va tuer l’application proprement dite , pas l’image de soi. #this est la racine principale du programme = () Tk w, h = root.winfo_screenwidth(), root.winfo_screenheight() # utilisez la ligne suivante si vous voulez également vous débarrasser de la barre de titre d’exécuter un plein écran app root.overrideredirect (1) root.geometry("%dx%d+0+0" % (w, h)) root.config(bg="black",padx=10,pady=10) #root.rowconfigure((0,1),weight=1) #root.columnconfigure ((0,1), poids = 1) #put le cadre ici pour le rendre disponible à l’échelle mondiale à l’armature de routines sub = Frame(relief=FLAT bg = "vert foncé", bd = "0") frame.rowconfigure((0,1),weight=1) frame.columnconfigure((0,1),weight=1) frame.pack_propagate(0) frame.pack (remplissage = BOTH, développez = 1) btnFont = tkFont.Font (famille = 'Times', taille = 32, poids = 'bold') si pas os.path.exists("christmas_wreath_placeholder.txt") : ouvrir ("christmas_wreath_placeholder.txt","w") root.after (300000, close_after) #call quitter après 5 minutes, quel que soit le whatapp = App(root) root.mainloop () #os.system ("pkill - x feh")#exit()
christmas_nowprinting.py
Obtenir la PI à l’AutoStart le Tkinter basé application Python avec la Session utilisateur
C’est une bouchée, mais fondamentalement, vous ne pouvez exécuter juste ce tkinter app python dépendant de la ligne de commande dans un environnement unique de la console, vous devez être dans un x-windows ou LXDE session, aka, un bureau Linux normal - pas de telnet ou SSH, puisqu’il s’agit d’une application GUI. Pour ce faire sur une facture pro forma framboise il y a un fichier de démarrage automatique spécifique que vous éditer qui exécute les applications non-GUI GUI ou après le bureau est chargé. Le mieux à que je peux comparer cela est le dossier « démarrage » de windows.
Modifiez le fichier suivant :
Vous pouvez le faire via une session de ligne de commande en tapant :
Puis ajoutez votre script pour lancer votre programme au bas du fichier, j’ai utilisé un script SH au coup d’envoi de mon dossier de christmas_motion.py. Voici à quoi ressemble le fichier de démarrage automatique :
Notez les derniers points de la ligne à mon dossier Launcher (christmas_launcher.sh) -mon fichier ressemble à ceci :
Ce fichier s’assure que je lance le christmas_motion.py à l’aide de SUDO / privilèges root pour que le GPIO prie dans le code python ont un niveau d’autorisations pour accéder les broches GPIO correct, sinon l’utilisateur standard de « PI » n’a pas les autorisations adéquates pour accéder les broches de capteur de mouvement.
J’ai essayé de lancer le christmas_motion.py directement dans le fichier de démarrage automatique, mais il en est résulté dans une boucle infinie bizarre du coup d’envoi de la même application maintes et maintes fois donc j’ai eu recours à mon script SH standard qui a travaillé à chaque fois.