309 lines
8.5 KiB
Python
309 lines
8.5 KiB
Python
|
|
#!/usr/local/bin/python
|
||
|
|
#Written by Mari DeGrazia
|
||
|
|
#arizona4n6@gmail.com
|
||
|
|
#Based off the All Seeing Pi by the Rasbperry Pi Foundation
|
||
|
|
|
||
|
|
from gpiozero import Button
|
||
|
|
from picamera import PiCamera
|
||
|
|
from time import gmtime, strftime,sleep
|
||
|
|
from overlay_functions import *
|
||
|
|
from shutil import copyfile
|
||
|
|
import subprocess
|
||
|
|
import Tkinter
|
||
|
|
import tkMessageBox
|
||
|
|
import ttk
|
||
|
|
from PIL import Image, ImageTk
|
||
|
|
import pygame
|
||
|
|
from smtplib import SMTP
|
||
|
|
from smtplib import SMTPException
|
||
|
|
import smtplib
|
||
|
|
from email.mime.image import MIMEImage
|
||
|
|
from email.mime.multipart import MIMEMultipart
|
||
|
|
import time
|
||
|
|
from multiprocessing import Process
|
||
|
|
import cwiid
|
||
|
|
|
||
|
|
###############CHANGE ME###########################
|
||
|
|
printer_MAC = "C4:30:00:00:7E:41"
|
||
|
|
my_email = 'myemail@gmail.com' # must be gmail account.
|
||
|
|
my_email_password = 'strongpassword'
|
||
|
|
subject = 'Graduation 2017'
|
||
|
|
####################################################
|
||
|
|
|
||
|
|
def start_wii_script():
|
||
|
|
cmd = "sudo python /home/pi/Pi-Photobooth/photobooth_wii.py &"
|
||
|
|
k = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||
|
|
message = k.communicate(input)
|
||
|
|
print message[0]
|
||
|
|
|
||
|
|
def kill_keyboard():
|
||
|
|
cmd = "sudo pkill -f matchbox-keyboard"
|
||
|
|
k = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||
|
|
message = k.communicate(input)
|
||
|
|
return
|
||
|
|
|
||
|
|
def next_overlay():
|
||
|
|
global overlay
|
||
|
|
global current_position
|
||
|
|
pygame.mixer.music.load("/home/pi/Pi-Photobooth/audio/slide_and_click.mp3")
|
||
|
|
pygame.mixer.music.play()
|
||
|
|
current_position = current_position + 1
|
||
|
|
if current_position >= len(overlays):
|
||
|
|
current_position = 0
|
||
|
|
overlay = overlays[current_position]
|
||
|
|
if overlay == "":
|
||
|
|
remove_overlays(camera)
|
||
|
|
else:
|
||
|
|
preview_overlay(camera, overlay)
|
||
|
|
|
||
|
|
def prev_overlay():
|
||
|
|
global overlay
|
||
|
|
global current_position
|
||
|
|
pygame.mixer.music.load("/home/pi/Pi-Photobooth/audio/slide_and_click.mp3")
|
||
|
|
pygame.mixer.music.play()
|
||
|
|
|
||
|
|
current_position = current_position - 1
|
||
|
|
overlay = overlays[current_position]
|
||
|
|
if overlay == "":
|
||
|
|
remove_overlays(camera)
|
||
|
|
else:
|
||
|
|
preview_overlay(camera, overlay)
|
||
|
|
|
||
|
|
def take_picture():
|
||
|
|
global output
|
||
|
|
global latest_photo
|
||
|
|
global current_position
|
||
|
|
global overlay
|
||
|
|
|
||
|
|
pygame.mixer.music.load("/home/pi/Pi-Photobooth/audio/CameraClick.mp3")
|
||
|
|
pygame.mixer.music.play()
|
||
|
|
output = strftime("/home/pi/Pi-Photobooth/photos/image-%d-%m_%H_%M_%S.png", gmtime())
|
||
|
|
time.sleep(.3)
|
||
|
|
camera.stop_preview()
|
||
|
|
|
||
|
|
remove_overlays(camera)
|
||
|
|
camera.hflip = False
|
||
|
|
camera.capture(output)
|
||
|
|
|
||
|
|
if overlay:
|
||
|
|
output_overlay(output, overlays[current_position])
|
||
|
|
else:
|
||
|
|
output_no_overlay(output)
|
||
|
|
size = 400, 400
|
||
|
|
gif_img = Image.open(output)
|
||
|
|
gif_img.thumbnail(size, Image.ANTIALIAS)
|
||
|
|
|
||
|
|
gif_img.save(latest_photo, 'gif')
|
||
|
|
loadImage(latest_photo)
|
||
|
|
camera.hflip = True
|
||
|
|
just_taken = True
|
||
|
|
|
||
|
|
def new_picture():
|
||
|
|
global overlay
|
||
|
|
kill_keyboard()
|
||
|
|
camera.start_preview()
|
||
|
|
time.sleep(1)
|
||
|
|
copyfile('/home/pi/Pi-Photobooth/images/loading.gif', '/home/pi/Pi-Photobooth/images/latest.gif')
|
||
|
|
remove_overlays(camera)
|
||
|
|
current_position = 0
|
||
|
|
loadImage(latest_photo)
|
||
|
|
overlay = ""
|
||
|
|
|
||
|
|
def remove():
|
||
|
|
global overlay
|
||
|
|
remove_overlays(camera)
|
||
|
|
overlay = ""
|
||
|
|
|
||
|
|
def print_photo():
|
||
|
|
global printer_MAC
|
||
|
|
kill_keyboard()
|
||
|
|
|
||
|
|
top = Tkinter.Tk()
|
||
|
|
top.title("Printing")
|
||
|
|
msg = Tkinter.Label(top, text="Sending to printer. Please wait 1-2 minutes.",width=50,background='#B1B1B1')
|
||
|
|
msg.pack()
|
||
|
|
top.geometry("%dx%d%+d%+d" % (400, 100, 250, 125))
|
||
|
|
top.configure(background='#B1B1B1')
|
||
|
|
center(top)
|
||
|
|
|
||
|
|
master.config(cursor="watch")
|
||
|
|
top.config(cursor="watch")
|
||
|
|
master.update()
|
||
|
|
top.update()
|
||
|
|
|
||
|
|
print ("Print photo")
|
||
|
|
pp = subprocess.Popen(["obexftp --nopath --noconn --uuid none --bluetooth " + printer_MAC + " --channel 4 -p " + output],shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||
|
|
message = pp.communicate(input)
|
||
|
|
master.config(cursor="")
|
||
|
|
top.destroy()
|
||
|
|
msg = "failed"
|
||
|
|
if msg.encode('utf-8') in message[0]:
|
||
|
|
tkMessageBox.showerror("Error", "Print failed. Check paper or make sure printer is on and paired and print again")
|
||
|
|
|
||
|
|
else:
|
||
|
|
tkMessageBox.showinfo("Printing", "Photo successfully sent. Now printing...")
|
||
|
|
|
||
|
|
return True
|
||
|
|
|
||
|
|
def get_email_address():
|
||
|
|
|
||
|
|
top = Tkinter.Tk()
|
||
|
|
top.title("Email")
|
||
|
|
msg = Tkinter.Label(top, text="Enter Email Address.",width=50,background='#B1B1B1')
|
||
|
|
msg.pack()
|
||
|
|
ttk.e = Tkinter.Entry(top,width=50)
|
||
|
|
ttk.e.pack()
|
||
|
|
|
||
|
|
b4 = Tkinter.Button(top, text='Send', command=lambda: send_picture(top))
|
||
|
|
b4.pack()
|
||
|
|
|
||
|
|
top.geometry("%dx%d%+d%+d" % (400, 100, 250, 125))
|
||
|
|
top.configure(background='#B1B1B1')
|
||
|
|
lower(top)
|
||
|
|
subprocess.Popen(['matchbox-keyboard'])
|
||
|
|
return
|
||
|
|
|
||
|
|
def send_picture(toplevel):
|
||
|
|
global output
|
||
|
|
global my_email
|
||
|
|
global my_email_password
|
||
|
|
global subject
|
||
|
|
master.config(cursor="watch")
|
||
|
|
master.config(cursor="watch")
|
||
|
|
|
||
|
|
#kill keyboard if its still there
|
||
|
|
email_address = ttk.e.get()
|
||
|
|
toplevel.destroy()
|
||
|
|
kill_keyboard()
|
||
|
|
print email_address
|
||
|
|
|
||
|
|
toaddr = email_address
|
||
|
|
me = my_email # redacted
|
||
|
|
|
||
|
|
msg = MIMEMultipart()
|
||
|
|
msg['Subject'] = subject
|
||
|
|
msg['From'] = my_email
|
||
|
|
msg['To'] = toaddr
|
||
|
|
msg.preamble = "Photo @ "
|
||
|
|
|
||
|
|
fp = open(output, 'rb')
|
||
|
|
img = MIMEImage(fp.read())
|
||
|
|
fp.close()
|
||
|
|
msg.attach(img)
|
||
|
|
|
||
|
|
try:
|
||
|
|
s = smtplib.SMTP('smtp.gmail.com',587)
|
||
|
|
s.ehlo()
|
||
|
|
s.starttls()
|
||
|
|
s.ehlo()
|
||
|
|
s.login(user = my_email,password = my_email_password)
|
||
|
|
|
||
|
|
s.sendmail(me, toaddr, msg.as_string())
|
||
|
|
s.quit()
|
||
|
|
master.config(cursor="")
|
||
|
|
tkMessageBox.showinfo("Info", "Email sent")
|
||
|
|
|
||
|
|
except SMTPException as error:
|
||
|
|
master.config(cursor="")
|
||
|
|
tkMessageBox.showerror("Error", "Error: unable to send email : {err}".format(err=error))
|
||
|
|
print "Error: unable to send email : {err}".format(err=error)
|
||
|
|
|
||
|
|
def center(toplevel):
|
||
|
|
toplevel.update_idletasks()
|
||
|
|
w = toplevel.winfo_screenwidth()
|
||
|
|
h = toplevel.winfo_screenheight()
|
||
|
|
size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
|
||
|
|
x = w/2 - size[0]/2
|
||
|
|
y = h/2 - size[1]/2
|
||
|
|
|
||
|
|
toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))
|
||
|
|
|
||
|
|
def lower(toplevel):
|
||
|
|
toplevel.update_idletasks()
|
||
|
|
w = toplevel.winfo_screenwidth()
|
||
|
|
h = toplevel.winfo_screenheight()
|
||
|
|
size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
|
||
|
|
x = w/2 - size[0]/2
|
||
|
|
y = h/2 - size[1]/2
|
||
|
|
|
||
|
|
toplevel.geometry("%dx%d+%d+%d" % (size + (x, y+150)))
|
||
|
|
|
||
|
|
|
||
|
|
def loadImage(latest_photo):
|
||
|
|
global picture3
|
||
|
|
picture3 = Tkinter.PhotoImage(file=latest_photo)
|
||
|
|
c.itemconfigure(picture2, image = picture3)
|
||
|
|
|
||
|
|
|
||
|
|
current_position = 0
|
||
|
|
pygame.mixer.init()
|
||
|
|
|
||
|
|
|
||
|
|
#reset image
|
||
|
|
copyfile('/home/pi/Pi-Photobooth/images/loading.gif', '/home/pi/Pi-Photobooth/images/latest.gif')
|
||
|
|
|
||
|
|
|
||
|
|
overlay = ""
|
||
|
|
next_overlay_btn = Button(23)
|
||
|
|
take_pic_btn = Button(11)
|
||
|
|
|
||
|
|
|
||
|
|
next_overlay_btn.when_pressed = next_overlay
|
||
|
|
take_pic_btn.when_pressed = take_picture
|
||
|
|
|
||
|
|
camera = PiCamera()
|
||
|
|
camera.resolution = (800, 480)
|
||
|
|
camera.hflip = True
|
||
|
|
|
||
|
|
|
||
|
|
camera.start_preview()
|
||
|
|
output = ""
|
||
|
|
latest_photo = '/home/pi/Pi-Photobooth/images/latest.gif'
|
||
|
|
|
||
|
|
p = Process(target=start_wii_script)
|
||
|
|
p.start()
|
||
|
|
|
||
|
|
|
||
|
|
next_overlay_Wii_button = Button(17)
|
||
|
|
picture_Wii_button = Button(9)
|
||
|
|
prev_overlay_Wii_Button = Button(21)
|
||
|
|
newpic_Wii_button = Button(20)
|
||
|
|
rem_overlays_Wii_button = Button(16)
|
||
|
|
|
||
|
|
newpic_Wii_button.when_pressed = new_picture
|
||
|
|
next_overlay_Wii_button.when_pressed = next_overlay
|
||
|
|
prev_overlay_Wii_Button.when_pressed = prev_overlay
|
||
|
|
picture_Wii_button.when_pressed = take_picture
|
||
|
|
|
||
|
|
|
||
|
|
rem_overlays_Wii_button.when_pressed = remove
|
||
|
|
master = Tkinter.Tk()
|
||
|
|
master.wm_title(subject)
|
||
|
|
master.attributes("-fullscreen", True)
|
||
|
|
c = Tkinter.Canvas(master, width=400, height=300)
|
||
|
|
|
||
|
|
picture = Tkinter.PhotoImage(file=latest_photo)
|
||
|
|
picture2 = c.create_image(200,150,image=picture)
|
||
|
|
c.pack()
|
||
|
|
|
||
|
|
photo1 = Tkinter.PhotoImage(file='/home/pi/Pi-Photobooth/images/button_new.gif')
|
||
|
|
photo2 = Tkinter.PhotoImage(file='/home/pi/Pi-Photobooth/images/button_print.gif')
|
||
|
|
photo3 = Tkinter.PhotoImage(file='/home/pi/Pi-Photobooth/images/button_email.gif')
|
||
|
|
|
||
|
|
b1 = Tkinter.Button(master, text="New Picture",command=new_picture,image=photo1)
|
||
|
|
b2 = Tkinter.Button(master, text="Print Picture",command=print_photo,image=photo2)
|
||
|
|
b3= Tkinter.Button(master, text="Email Picture",command=get_email_address,image=photo3)
|
||
|
|
|
||
|
|
b1.image = photo1
|
||
|
|
b2.image = photo2
|
||
|
|
b3.image = photo3
|
||
|
|
|
||
|
|
b1.pack()
|
||
|
|
b2.pack()
|
||
|
|
b3.pack()
|
||
|
|
|
||
|
|
|
||
|
|
Tkinter.mainloop( )
|
||
|
|
|
||
|
|
|