Fotobox

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
FotoboxHS
User
Beiträge: 2
Registriert: Donnerstag 5. Dezember 2019, 07:55

Hallo zusammen,

wir möchten eine Fotobox optimieren basierend auf eine Raspberry Pi 3 Steuerung.
Wir wollen einen Filter-Button erzeugen und in diesem Button sollen weitere Buttons für verschiedene Filter-Funktionen angezeigt werden. Leider bekommen wir das nicht so richtig hin, da wir in auch sogenannte Anfänger in der Python Sprache sind.
Für eure Unterstützung bedanke ich mich im Voraus!

Hier noch der aktuelle Code:

Code: Alles auswählen

from tkinter import *
import PIL
from PIL import Image, ImageTk
from os import *
from picamera import PiCamera
from time import sleep
from datetime import *
from picamera import Color
from os import walk
import os
import datetime
import time
from glob import *
from os import listdir
import RPi.GPIO as GPIO
from tkinter import messagebox
import cups
import io
import subprocess
from tkinter import ttk

class MainGui:
    def __init__(self):
        self.cam = PiCamera()
        now = datetime.datetime.now()
        self.daytag = str(now.day) + "_" + str(now.month) + "_" + str(now.year) + "/"
        self.usbPfad = "/media/pi/BD23-DD96/FotoBox_Bilder/" #falls Stick vorhanden, dieser Pfad
        self.defPfad = "/home/pi/Bilder/" #falls kein Stick vorhanden, Verzeichnis auf microSD
        self.mainWindow = Tk()
        self.mainWindow.attributes("-fullscreen",True) #Vollbild Programm
        self.mainWindow.title("Fotobox")
        self.mainWindow.configure(background="#ffffff")
        self.mainWindow.geometry("1280x720")
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(19, GPIO.OUT)
        GPIO.setwarnings(False)
        #Read Pic counter from File
        self.counter = 0
        self.counter = self.readCounter()
        #Header
        header = Frame(self.mainWindow,borderwidth=0)
        header.pack(side=TOP)
        #Close Button
        imgClose = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/close_img.png"))
        Button(self.mainWindow,borderwidth=0,background="#ffffff",height=100,width=100,highlightthickness = 0,image=imgClose,command=self.askToQuit).place(relx=0.95,anchor=N)
        #Logo
        img = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox/0.png"))  #Logo HSPF
        imgLabel = Label(header,text="HOCHSCHULE PFORZHEIM", font="Sans 20 bold" ,image = img,borderwidth=0)
        imgLabel.pack()
        #Body
        frame = Frame(self.mainWindow,borderwidth=0)
        frame.configure(background="#000000")
        frame.pack(expand=NO,pady=20)
        #Buttons Einzelbild, Serienbild, Galerie:
        Button(frame,borderwidth=2,text="Einzelbild",bg="#EBBB32",padx=8,pady=5, font="Sans 20 bold", height = 5, width = 15,command = self.einzelbild_click).pack(side=LEFT)
        Button(frame,borderwidth=2,text="Serienbild",bg="#EBBB32",padx=8,pady=5, font="Sans 20 bold", height = 5, width = 15,command=self.serienbilder_click).pack(side=LEFT)
        Button(frame,borderwidth=2,text="Galerie",bg="#EBBB32",padx=8,pady=5, font="Sans 20 bold", height = 5, width = 15,command = self.galerie_click).pack(side=LEFT)
        
        #Footer
        footer = Frame(self.mainWindow,borderwidth=0)
        footer.configure(background="#ffffff")
        footer.pack(side=BOTTOM)
        self.lbl = Label(footer,bg="#ffffff",font="Sans 16 bold",fg="#F56363")
        self.lbl.pack()
        Button(footer,borderwidth=0,text="HOW TO",bg="#ffffff",height=50,width=20,highlightthickness = 0,font="Sans 20 bold",command=self.howTo_Click).pack(side=TOP,padx=2,pady=60)
        self.mainWindow.mainloop()


        #Einzelbild 1 Foto
    def einzelbild_click(self):
        self.take_photo(1)

        #Serienbild 4 Fotos
    def serienbilder_click(self):
        self.take_photo(4)
        
        #Open Gallery
    def galerie_click(self):
        bilderList = []
        bilderList = glob(str(self.getFileDir()) + "*.jpg")
        if len(bilderList) == 0:
            self.lbl["text"] = "Galerie ist leer!"
            self.lbl.update()
            sleep(2)
            self.lbl["text"] = ""
            self.lbl.update()
        else:
            gallery = ImgWindow(bilderList,True)



            
    def howTo_Click(self):
        howto = HowToWindow()
        
    def close_mainWindow(self):
        self.mainWindow.destroy()

    def take_photo(self,bilderAnzahl):
        bilderList = []
        self.cam.resolution = (2592,1944)
        self.cam.hflip = True
        self.cam.framerate = 15
        self.cam.start_preview()
        for i in range(bilderAnzahl):
            self.cam.annotate_text_size = 150
            self.cam.annotate_background = Color('black')
            self.cam.annotate_foreground = Color('white')
            if bilderAnzahl > 1:
                self.cam.annotate_text = " Bild: " + str(i + 1) + " von " + str(bilderAnzahl) + " " 
            else:
                self.cam.annotate_text = " Bereit ?! "
            sleep(2)    
            #Time as Pic Name
            #pfadDir = str(self.getFileDir() + "Pic_" + str(int(time.time())) + ".jpg")
            #Counter as Pic Name

            self.counter += 1
            self.updateCounter()
            pfadDir = str(self.getFileDir() + "Pic_" + str(self.counter) + ".jpg")
            self.cam.annotate_text = ""
            #Timer
            for i in range(5):
                self.cam.annotate_text_size = 150
             
                self.cam.annotate_background = Color('black')
                self.cam.annotate_foreground = Color('white')
                if 5 - i == 1:
                    GPIO.output(19, GPIO.HIGH) 
                    self.cam.annotate_text = " Bitte laecheln :-) "
                else:
                    self.cam.annotate_text = str(5 - i)
                sleep(1)
                self.cam.annotate_text = ""
            self.cam.capture(pfadDir)
            bilderList.append(pfadDir)
            GPIO.output(19, GPIO.LOW)
        self.cam.stop_preview()
        
        preview = ImgWindow(bilderList,False)
       
        
    def getFileDir(self):
        if os.path.isdir(self.usbPfad):
            if not os.path.isdir(str(self.usbPfad + self.daytag)):
                os.makedirs(self.usbPfad + self.daytag)
            return str(self.usbPfad + self.daytag)   
        elif os.path.isdir(self.defPfad):  
            if not os.path.isdir(self.defPfad + self.daytag):
                os.makedirs(self.defPfad + self.daytag)
            return str(self.defPfad + self.daytag)
   
    #Quit Yes or No
    def askToQuit(self):
        if messagebox.askyesno("Photobox","Wollen Sie das Programm wirklich beenden?"):
            self.close_mainWindow()

    def setCounter(self):
        self.counter = self.readCounter()

    def readCounter(self):
        file = open("/home/pi/Schreibtisch/FotoBox_V2/counter.txt",os.O_RDONLY|os.O_CREAT)
        count = int(read(file,100))
        close(file)
        return count

    def updateCounter(self):
        file = open("/home/pi/Schreibtisch/FotoBox_V2/counter.txt",os.O_WRONLY|os.O_CREAT)
        count = str.encode(str(self.counter))
        write(file,count)
        close(file)

class ImgWindow:
    def __init__(self,photoList,useGalleryGUI):
        self.pfad = []
        self.pfad = photoList
        self.useGalleryGUI = useGalleryGUI
        self.pointer = 0
        self.imgWindow = Toplevel()
        self.imgWindow.configure(background="#ffffff")
        self.imgWindow.attributes("-fullscreen",True)
        self.img = ImageTk.PhotoImage(Image.open(self.pfad[self.pointer]))
        self.panel = Label(self.imgWindow,bg="#ffffff",height=600,image = self.img) #Rahm von Bild
        self.panel.pack(padx=2,pady=10,fill=BOTH,expand=YES)
        self.frame =Frame(self.imgWindow,bg="#ffffff")
        self.frame.pack(side=BOTTOM,fill=BOTH)
        self.homeImg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/home.png"))
        self.printImg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/print.png"))
        #Init Printer
        startPrinter = "cupsenable Canon_SELPHY_CP1300"
        subprocess.call(startPrinter, shell=True)
        if self.useGalleryGUI:
            Button(self.frame,text="<",bg="#EBBB32",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.showPrevPic).pack(side=LEFT) 
            Button(self.frame,text=">",bg="#EBBB32",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.showNextPic).pack(side=RIGHT)   
            self.frame2 = Frame(self.frame,height=30,width=250,bg="#ffffff")
            self.frame2.pack(side=BOTTOM)
            Button(self.frame2,borderwidth=0,highlightthickness=0,bg="#ffffff",height=50,width=130,padx=1,pady=1,image=self.homeImg,command=self.closeWindow).pack(side=RIGHT,ipady=30,padx=80)
            #Print Button
            Button(self.frame2,borderwidth=0,highlightthickness=0,bg="#ffffff",height=50,width=130,padx=1,pady=1,image=self.printImg,command=self.Print).pack(side=LEFT,ipady=30,padx=80)
        else:    
            Button(self.frame,text="Behalten",bg="#1ca706",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.keepImg).pack(side=LEFT)             
            Button(self.frame,text="Löschen",bg="#993232",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.delete_image).pack(side=RIGHT)     
            self.frame2 = Frame(self.frame,height=30,width=50,bg="#ffffff")
            self.frame2.pack(side=BOTTOM)
            #Print Button
            Button(self.frame2,borderwidth=0,highlightthickness=0,bg="#ffffff",height=30,width=120,padx=1,pady=1,image=self.printImg,command=self.Print).pack(side=BOTTOM,ipady=22,padx=0)
        txtLabel = str(1) + " von " + str(len(self.pfad))
        self.l = Label(self.frame2,bg="#ffffff",font="Sans 17 bold",fg="#EBBB32",text=txtLabel)
        self.l.pack(side=TOP)
        self.makePreview(0)
        self.imgWindow.mainloop()

    def closeWindow(self):
        self.imgWindow.destroy()

    def makePreview(self,pointer):
        #Resize Image for Preview
        self.img = ImageTk.PhotoImage(Image.open(self.pfad[pointer]).resize((1280,720),Image.ANTIALIAS))
     
        
        self.panel["image"] = self.img
        self.l["text"] = str(pointer + 1) + " von " + str(len(self.pfad))
        self.l.update()

    def showNextPic(self):
        if self.pointer + 1  < len(self.pfad):
            self.pointer +=1
        else:
            self.pointer = 0    
        self.makePreview(self.pointer)
            
    def showPrevPic(self):
        if self.pointer > 0:
             self.pointer -= 1
        else:
             self.pointer = len(self.pfad) - 1    
        self.makePreview(self.pointer)

    def keepImg(self):
        if self.pointer < len(self.pfad) - 1:
            self.pointer += 1
            self.makePreview(self.pointer)
        else:
            self.closeWindow()    
    
    def delete_image(self):   
        if path.exists(str(self.pfad[self.pointer])):
            remove(str(self.pfad[self.pointer]))
        if self.pointer < len(self.pfad) - 1:
            self.pointer += 1
            self.makePreview(self.pointer)
        else:
            self.closeWindow()

    #Print Function
    def Print(self):
        cmd = 'lp -d Canon_SELPHY_CP1300 -o raw  ' +  self.pfad[self.pointer]
        subprocess.call(cmd, shell=True)
        conn = cups.Connection()
        printers = conn.getPrinters()
        cups.setUser('pi')
        txt = str(printers['Canon_SELPHY_CP1300']['printer-state-reasons']) #Check for Error
        print(txt) #print error
        if (txt == "['none']"):
            waitSec = 0
            progress = ttk.Progressbar(self.panel,value=waitSec,length=200,max=35, mode="determinate")
            progress.pack(side=BOTTOM,pady=20)
            for i in range(35):
                waitSec = waitSec + 1
                sleep(1)
                progress['value'] = waitSec
                if(i%2 == 0):
                    self.l["text"] ='Printing.'
                else:
                     self.l["text"] ='Printing..'
                self.l.update()
                progress.update() 
            self.l["text"] = str(self.pointer + 1) + " von " + str(len(self.pfad))
            self.l.update()
            progress.destroy()
            #self.ImgWindow.update()
        else:
            errorText = "Fehler: Drucker ist nicht verbunden!!"
            error = Label(self.panel,bg="#ffffff",font="Sans 14 bold",fg="#EBBB32",text=errorText)
            error.pack(side=BOTTOM)
            self.panel.update()
            sleep(4)
            error.destroy()
        for printer in printers:
             print (printers)
            #print (conn.printFile('Canon_SELPHY_CP1300',str(self.pfad[self.pointer]),"test",{}))
    
            
#How To window  
class HowToWindow:
    def __init__(self):
        self.howToWindow = Toplevel()
        self.howToWindow.configure(background="#ffffff")
        self.howToWindow.attributes("-fullscreen",True)
        #HowTo Image
        self.howToimg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/howTo.jpeg"))
        self.panel = Label(self.howToWindow,bg="#ffffff",height=630,image = self.howToimg)
        self.panel.pack(padx=1,pady=1,fill=BOTH,expand=YES)
        #Home Button
        self.homeImg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/home.png"))
        Button(self.howToWindow,borderwidth=0,bg="#ffffff",padx=1,pady=1,highlightthickness = 0,height=90,width=100,command=self.closeWindow,image=self.homeImg).pack(side=BOTTOM,ipady=20)

    def closeWindow(self):
        self.howToWindow.destroy()
        
#"App" erstellen
photobox = MainGui()
GPIO.cleanup()




Mit freundlichen Grüßen
FotoboxHS
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Setze deinen Code bitte in Codetags damit er lesbar ist.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Sternchenimporte sind böse, damit holst Du Dir unkontrolliert Namen in den eigenen Namensraum. tkinter wird üblicherweise per `import tkinter as tk` eingebunden und alle Namen z.B. über tk.Tk angesprochen.
` os` wird insgesamt vier mal importiert, einmal per *, üblich ist, alle Namen per os.listdir anzusprechen. Besser ist aber sowieso statt os und glob die Entsprechungen aus pathlib zu verwenden.
Bei `datetime` ist es noch schlimmer, da wird erstmal datetime.datetime per * importiert und dieses datetime dann mit dem Modul datetime wieder überschrieben.

Strings setzt man nicht per str() und + zusammen, sondern nimmt Format-Strings, die Bei datetime-Objekten auch gleich Monat, Jahr usw. formatieren können.

Ein GPIO-Setup erwarte ich nicht innerhalb der __init__ einer GUI. Das sollte in eine separate Funktion wandern, die man direkt in ` main` aufruft. Warnungen sind dazu da, dass man die Ursache behebt, nicht dass man sie ignoriert. Dazu muss immer GPIO.cleanup aufgerufen werden, indem es in einem finally-Block steht, dessen try-Block die gesamte ` main` umfasst.

Fixe Pfade sollten nicht mitten im Code stehen, sondern am Anfang als Konstanten.
Konvention ist es, Attribute wie Variablennamen oder Funktionsnamen klein_mit_unterstrich zu schreiben.
__init__ ist dazu da, ein Objekt zu initialisieren, nicht dass es darin ewig läuft. Das mainloop gehört in die main-Funktion

In `galerie_click` wird erst bilderList mit einer leeren Liste initialisiert, dann aber sofort wieder mit dem Rückgabewert von glob überschrieben. Die erste Zeile gehört gelöscht. Statt glob benutzt man pathlib.Path.glob.
` update` hat in einem GUI-Programm nichts verloren, genausowenig sleep. Wenn man was nur für kurze Zeit anzeigen will, benutzt man ` after`.

In `readCounter` wird open von os.open benutzt. Das ist seehr verwirrend, weil es auch das Standard ` open` gibt. Das sollte man auch hier verwenden, weil die os-Funktionen zu low-level sind.

Es sollte im gesamten Programm nur ein mainloop geben (in ` main` ). In ImgWindow.__init__ steht aber schon wieder eins.

subprocess.call sollte man durch subprocess.run ersetzen und shell=True sollte man nicht benutzen.

Die letzten beiden Zeilen (mit dem, was da sonst noch hin sollte) steht üblicherweise in einer Funktion, die ´ main` heißt. Sieht dann so aus:

Code: Alles auswählen

def main():
    try:
        gpio_setup()
        photobox = MainGui()
        photobox.mainloop()
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    main()
FotoboxHS
User
Beiträge: 2
Registriert: Donnerstag 5. Dezember 2019, 07:55

Hi Sirius3,

vielen Dank für die Rückmeldung. Wir haben versucht jetzt einige Dinge so umzustellen, wie du es oben beschrieben hattest.
Leider funktioniert der Code gerade gar nicht mehr und er zeigt uns eine Fehlermedlung bei der Durchführung an. Wir finden aber den Fehler nicht :(

import PIL
from PIL import Image, ImageTk
from picamera import PiCamera
from time import after
from picamera import Color
from datetime import datetime
import time
from os import listdir
import RPi.GPIO as GPIO
from tkinter import messagebox
import cups
import io
import subprocess
from tkinter import ttk

class MainGui:
def __init__(self):
self.cam = PiCamera()
now = datetime.now()
self.daytag = str(now.day) + "_" + str(now.month) + "_" + str(now.year) + "/"
self.usbPfad = "/media/pi/BD23-DD96/FotoBox_Bilder/" #falls Stick vorhanden, dieser Pfad
self.defPfad = "/home/pi/Bilder/" #falls kein Stick vorhanden, Verzeichnis auf microSD
self.mainWindow = Tk()
self.mainWindow.attributes("-fullscreen",True) #Vollbild Programm
self.mainWindow.title("Fotobox")
self.mainWindow.configure(background="#ffffff")
self.mainWindow.geometry("1280x720")
GPIO.setmode(GPIO.BCM)
GPIO.setup(19, GPIO.OUT)
GPIO.setwarnings(False)
#Read Pic counter from File
self.counter = 0
self.counter = self.readCounter()
#Header
header = Frame(self.mainWindow,borderwidth=0)
header.pack(side=TOP)
#Close Button
imgClose = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/close_img.png"))
Button(self.mainWindow,borderwidth=0,background="#ffffff",height=100,width=100,highlightthickness = 0,image=imgClose,command=self.askToQuit).place(relx=0.95,anchor=N)
#Logo
img = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox/0.png")) #Logo HSPF
imgLabel = Label(header,text="HOCHSCHULE PFORZHEIM", font="Sans 20 bold" ,image = img,borderwidth=0)
imgLabel.pack()
#Body
frame = Frame(self.mainWindow,borderwidth=0)
frame.configure(background="#000000")
frame.pack(expand=NO,pady=20)
#Buttons Einzelbild, Serienbild, Galerie:
Button(frame,borderwidth=2,text="Einzelbild",bg="#EBBB32",padx=8,pady=5, font="Sans 20 bold", height = 5, width = 15,command = self.einzelbild_click).pack(side=LEFT)
Button(frame,borderwidth=2,text="Serienbild",bg="#EBBB32",padx=8,pady=5, font="Sans 20 bold", height = 5, width = 15,command=self.serienbilder_click).pack(side=LEFT)
Button(frame,borderwidth=2,text="Galerie",bg="#EBBB32",padx=8,pady=5, font="Sans 20 bold", height = 5, width = 15,command = self.galerie_click).pack(side=LEFT)

#Footer
footer = Frame(self.mainWindow,borderwidth=0)
footer.configure(background="#ffffff")
footer.pack(side=BOTTOM)
self.lbl = Label(footer,bg="#ffffff",font="Sans 16 bold",fg="#F56363")
self.lbl.pack()
Button(footer,borderwidth=0,text="HOW TO",bg="#ffffff",height=50,width=20,highlightthickness = 0,font="Sans 20 bold",command=self.howTo_Click).pack(side=TOP,padx=2,pady=60)
self.mainWindow.mainloop()


#Einzelbild 1 Foto
def einzelbild_click(self):
self.take_photo(1)

#Serienbild 4 Fotos
def serienbilder_click(self):
self.take_photo(4)

#Open Gallery
def galerie_click(self):
bilderList = pathlib.Path.glob(str(self.getFileDir()) + "*.jpg")
if len(bilderList) == 0:
self.lbl["text"] = "Galerie ist leer!"
after(2)
self.lbl["text"] = ""
else:
gallery = ImgWindow(bilderList,True)




def howTo_Click(self):
howto = HowToWindow()

def close_mainWindow(self):
self.mainWindow.destroy()

def take_photo(self,bilderAnzahl):
bilderList = []
self.cam.resolution = (2592,1944)
self.cam.hflip = True
self.cam.framerate = 15
self.cam.start_preview()
for i in range(bilderAnzahl):
self.cam.annotate_text_size = 150
self.cam.annotate_background = Color('black')
self.cam.annotate_foreground = Color('white')
if bilderAnzahl > 1:
self.cam.annotate_text = " Bild: " + str(i + 1) + " von " + str(bilderAnzahl) + " "
else:
self.cam.annotate_text = " Bereit ?! "
after(2)
#Time as Pic Name
#pfadDir = str(self.getFileDir() + "Pic_" + str(int(time.time())) + ".jpg")
#Counter as Pic Name

self.counter += 1
self.updateCounter()
pfadDir = str(self.getFileDir() + "Pic_" + str(self.counter) + ".jpg")
self.cam.annotate_text = ""
#Timer
for i in range(5):
self.cam.annotate_text_size = 150

self.cam.annotate_background = Color('black')
self.cam.annotate_foreground = Color('white')
if 5 - i == 1:
GPIO.output(19, GPIO.HIGH)
self.cam.annotate_text = " Bitte laecheln :-) "
else:
self.cam.annotate_text = str(5 - i)
after(1)
self.cam.annotate_text = ""
self.cam.capture(pfadDir)
bilderList.append(pfadDir)
GPIO.output(19, GPIO.LOW)
self.cam.stop_preview()

preview = ImgWindow(bilderList,False)


def getFileDir(self):
if os.path.isdir(self.usbPfad):
if not os.path.isdir(str(self.usbPfad + self.daytag)):
os.makedirs(self.usbPfad + self.daytag)
return str(self.usbPfad + self.daytag)
elif os.path.isdir(self.defPfad):
if not os.path.isdir(self.defPfad + self.daytag):
os.makedirs(self.defPfad + self.daytag)
return str(self.defPfad + self.daytag)

#Quit Yes or No
def askToQuit(self):
if messagebox.askyesno("Photobox","Wollen Sie das Programm wirklich beenden?"):
self.close_mainWindow()

def setCounter(self):
self.counter = self.readCounter()

def readCounter(self):
file = open("/home/pi/Schreibtisch/FotoBox_V2/counter.txt",os.O_RDONLY|os.O_CREAT)
count = int(read(file,100))
close(file)
return count

def updateCounter(self):
file = open("/home/pi/Schreibtisch/FotoBox_V2/counter.txt",os.O_WRONLY|os.O_CREAT)
count = str.encode(str(self.counter))
write(file,count)
close(file)

class ImgWindow:
def __init__(self,photoList,useGalleryGUI):
self.pfad = []
self.pfad = photoList
self.useGalleryGUI = useGalleryGUI
self.pointer = 0
self.imgWindow = Toplevel()
self.imgWindow.configure(background="#ffffff")
self.imgWindow.attributes("-fullscreen",True)
self.img = ImageTk.PhotoImage(Image.open(self.pfad[self.pointer]))
self.panel = Label(self.imgWindow,bg="#ffffff",height=600,image = self.img) #Rahm von Bild
self.panel.pack(padx=2,pady=10,fill=BOTH,expand=YES)
self.frame =Frame(self.imgWindow,bg="#ffffff")
self.frame.pack(side=BOTTOM,fill=BOTH)
self.homeImg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/home.png"))
self.printImg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/print.png"))
#Init Printer
startPrinter = "cupsenable Canon_SELPHY_CP1300"
subprocess.run(startPrinter)
if self.useGalleryGUI:
Button(self.frame,text="<",bg="#EBBB32",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.showPrevPic).pack(side=LEFT)
Button(self.frame,text=">",bg="#EBBB32",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.showNextPic).pack(side=RIGHT)
self.frame2 = Frame(self.frame,height=30,width=250,bg="#ffffff")
self.frame2.pack(side=BOTTOM)
Button(self.frame2,borderwidth=0,highlightthickness=0,bg="#ffffff",height=50,width=130,padx=1,pady=1,image=self.homeImg,command=self.closeWindow).pack(side=RIGHT,ipady=30,padx=80)
#Print Button
Button(self.frame2,borderwidth=0,highlightthickness=0,bg="#ffffff",height=50,width=130,padx=1,pady=1,image=self.printImg,command=self.Print).pack(side=LEFT,ipady=30,padx=80)
else:
Button(self.frame,text="Behalten",bg="#1ca706",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.keepImg).pack(side=LEFT)
Button(self.frame,text="Löschen",bg="#993232",fg="#ffffff",font="Sans 20 bold", height = 3, width = 10,command=self.delete_image).pack(side=RIGHT)
self.frame2 = Frame(self.frame,height=30,width=50,bg="#ffffff")
self.frame2.pack(side=BOTTOM)
#Print Button
Button(self.frame2,borderwidth=0,highlightthickness=0,bg="#ffffff",height=30,width=120,padx=1,pady=1,image=self.printImg,command=self.Print).pack(side=BOTTOM,ipady=22,padx=0)
txtLabel = str(1) + " von " + str(len(self.pfad))
self.l = Label(self.frame2,bg="#ffffff",font="Sans 17 bold",fg="#EBBB32",text=txtLabel)
self.l.pack(side=TOP)
self.makePreview(0)


def closeWindow(self):
self.imgWindow.destroy()

def makePreview(self,pointer):
#Resize Image for Preview
self.img = ImageTk.PhotoImage(Image.open(self.pfad[pointer]).resize((1280,720),Image.ANTIALIAS))


self.panel["image"] = self.img
self.l["text"] = str(pointer + 1) + " von " + str(len(self.pfad))
self.l.update()

def showNextPic(self):
if self.pointer + 1 < len(self.pfad):
self.pointer +=1
else:
self.pointer = 0
self.makePreview(self.pointer)

def showPrevPic(self):
if self.pointer > 0:
self.pointer -= 1
else:
self.pointer = len(self.pfad) - 1
self.makePreview(self.pointer)

def keepImg(self):
if self.pointer < len(self.pfad) - 1:
self.pointer += 1
self.makePreview(self.pointer)
else:
self.closeWindow()

def delete_image(self):
if path.exists(str(self.pfad[self.pointer])):
remove(str(self.pfad[self.pointer]))
if self.pointer < len(self.pfad) - 1:
self.pointer += 1
self.makePreview(self.pointer)
else:
self.closeWindow()

#Print Function
def Print(self):
cmd = 'lp -d Canon_SELPHY_CP1300 -o raw ' + self.pfad[self.pointer]
subprocess.run(cmd)
conn = cups.Connection()
printers = conn.getPrinters()
cups.setUser('pi')
txt = str(printers['Canon_SELPHY_CP1300']['printer-state-reasons']) #Check for Error
print(txt) #print error
if (txt == "['none']"):
waitSec = 0
progress = ttk.Progressbar(self.panel,value=waitSec,length=200,max=35, mode="determinate")
progress.pack(side=BOTTOM,pady=20)
for i in range(35):
waitSec = waitSec + 1
after(1)
progress['value'] = waitSec
if(i%2 == 0):
self.l["text"] ='Printing.'
else:
self.l["text"] ='Printing..'
self.l.update()
progress.update()
self.l["text"] = str(self.pointer + 1) + " von " + str(len(self.pfad))
self.l.update()
progress.destroy()
#self.ImgWindow.update()
else:
errorText = "Fehler: Drucker ist nicht verbunden!!"
error = Label(self.panel,bg="#ffffff",font="Sans 14 bold",fg="#EBBB32",text=errorText)
error.pack(side=BOTTOM)
self.panel.update()
after(4)
error.destroy()
for printer in printers:
print (printers)
#print (conn.printFile('Canon_SELPHY_CP1300',str(self.pfad[self.pointer]),"test",{}))


#How To window
class HowToWindow:
def __init__(self):
self.howToWindow = Toplevel()
self.howToWindow.configure(background="#ffffff")
self.howToWindow.attributes("-fullscreen",True)
#HowTo Image
self.howToimg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/howTo.jpeg"))
self.panel = Label(self.howToWindow,bg="#ffffff",height=630,image = self.howToimg)
self.panel.pack(padx=1,pady=1,fill=BOTH,expand=YES)
#Home Button
self.homeImg = ImageTk.PhotoImage(Image.open("/home/pi/Schreibtisch/FotoBox_V2/home.png"))
Button(self.howToWindow,borderwidth=0,bg="#ffffff",padx=1,pady=1,highlightthickness = 0,height=90,width=100,command=self.closeWindow,image=self.homeImg).pack(side=BOTTOM,ipady=20)

def closeWindow(self):
self.howToWindow.destroy()


def main():
try:
gpio_setup()
photobox = MainGui()
photobox.mainloop()
finally:
GPIO.cleanup()

if __name__ == '__main__':
main()
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt wäre es noch gut, wenn Du den kompletten Fehler posten würdest und den Code hier in Code-Tags setzen würdest.
Auf den ersten Blick sehe ich, dass einige Namen aus tkinter gar nicht mehr importiert werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@FotoboxHS: Bitte wirklich Code hier im Forum in Code-Tags setzen.

Wenn ihr versucht mehrere Dinge zu ändern, dann ändert die nicht alle auf einmal sondern eine nach der anderen. Und jedes mal prüfen ob der Code nach der einzelnen Veränderung noch läuft. Denn ihr habt da jetzt mehrere voneinander unabhängige Fehler eingebaut. Das hätte so nicht passieren dürfen. Denn das man einen Sternchen-Import nicht einfach dadurch los wird das man die Import-Zeile löscht und sonst *nichts* macht, muss auffallen bevor man versucht `sleep()` durch `after()` zu ersetzen in dem man versucht eine nichtvorhandene `after()`-Funktion aus dem `time`-Modul zu importieren. Oder umgekehrt, wenn man das in umgekehrter Reihenfolge macht. Es dürften jedenfalls nicht beide Fehler gleichzeitig im Programm sein, weil einer der beiden schon dazu führt das es nicht mehr läuft.

Und den Code für die `main()` einfach nur kopieren ohne eine `gpio_setup()`-Funktion und eine `mainloop()`-Methode auf `MainGui` zur Verfügung zu stellen, wird sicher auch nicht klappen.

Wenn man bei `subprocess` das ``shell=True`` weg lässt, dann muss man sich auch selbst darum kümmern die Kommandozeile auf Programmname und einzelne Argumente aufzuteilen.

`os` ist auch nicht mehr definiert, wird aber an einigen Stellen versucht zu verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten