simplebooth/photobooth.py

309 lines
8.5 KiB
Python
Raw Normal View History

2017-06-04 05:37:21 +00:00
#!/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( )