Python – EXIF und Tkinter

Da hab ich mir jetzt aber einen zusammen gewürfelt. Ab und zu beschäftige ich mich ja mal mit der Programmiersprache Python. Es macht spaß, braucht aber auch Zeit. Man muss viel lesen und ausprobieren. Und genau das habe ich gemacht. Ich habe mich in die Welt von Tkinter eingelesen und gleichzeitig versucht, mein kleines Programm zum entfernen der EXIF Daten, in die Welt der Fenster zu heben. Der Code ist ein wenig durcheinander und unstrukturiert. Man kann einiges besser und vor allem strukturierter umsetzen. Es handelt sich eben um einen Prototypen, der keinen Schönheitswettbewerb gewinnen möchte. Aber der Code funktioniert, wenn auch als frühe Beta Version. Es müssten z.B. noch adäquate Fehlerabfragen hinzugefügt werden. Nun gut, man kann nicht alles haben. Der Text für die Anleitung wird aus einer separaten Textdatei gezogen, die im gleichen Verzeichnis liegen muss. Wie auch immer, hier ist der Code.

from tkinter import *
from tkinter import ttk
import tkinter.font as tkFont
from tkinter import filedialog
import os
from PIL import Image
import sys

reset = os.getcwd()
#Funktion Verzeichnis waehlen
def DIR():
    global pfad
    pfad = filedialog.askdirectory(initialdir="/", title="Verzeichnis wählen")
    return pfad
    
#Hauptprogramm löschen exif daten
def START():
    # Ausgewaehlten uebernehmen
    dir_path = pfad
    os.chdir(pfad)
    for infile in os.listdir(dir_path):
        #Ausgwaehlten Dateityp uebernehmen
        if infile.endswith(Combo.get()):
            try:
                # Originalbild öffnen
                image = Image.open(infile)
                # Dateiname von Dateierweiterung trennen
                filename, extension = os.path.splitext(infile)
                outfile = filename + zusatz.get() + "." + Combo.get()
                # EXIF Daten löschen
                data = list(image.getdata())
                ohne_exif = Image.new(image.mode, image.size)
                ohne_exif.putdata(data)
                # Neues Bild speichern
                ohne_exif.save(outfile, quality=Scala2.get())
                # Originalbild schließen
                image.close()
                # Mögliche Fehler von open() und save() ausgeben
            except (IOError, KeyError) as e:
                fehler()
    fertig()

#Funktion neues Fenster (Fertig)
def fertig():
    done = Tk()
    done.geometry("200x100")
    label5=Label(done, text="Fertig", font=("Arial",28))
    label5.pack(pady=10)
    os.chdir(reset)
    button3 = Button(done, text = "OK", command = done.destroy)
    button3.pack(padx = 5, pady = 5)
    done.title("Weg mit den Exifs")
    done.mainloop()

#Funktion neues Fenster (Fehler)
def fehler():
    done = Tk()
    done.geometry("200x100")
    label1=Label(done, text="Fehler beim Lesen/Schreiben", font=("Arial",28))
    label1.pack(pady=10)
    os.chdir(reset)
    button3 = Button(done, text = "OK", command = done.destroy)
    button3.pack(padx = 5, pady = 5)
    done.title("Weg mit den Exifs")
    done.mainloop()

#Fenster Menue Ueber
def UEBER():
    uber = Tk()
    uber.geometry("210x140")
    label1=Label(uber, text="Version beta 0.1\nJuli 2022\n\nOM", font=("Arial",14))
    label1.pack(pady=10)
    button1 = Button(uber, text = "OK", command = uber.destroy)
    button1.pack(padx = 5, pady = 5)
    uber.title("Weg mit den Exifs")
    uber.mainloop()

#Fenster Menue Anleitung
def ANLEI():
    with open('anleitung.txt') as f:
        contents = f.read()
        f.close
    anlei = Tk()
    #anlei.geometry("200x140")
    label1=Label(anlei, text=contents,justify="left", font=("Arial",14))
    label1.pack(pady=10, padx=10)
    button1 = Button(anlei, text = "OK", command = anlei.destroy)
    button1.pack(padx = 5, pady = 10)
    anlei.title("Weg mit den Exifs")
    anlei.mainloop()

# Haupt GUI
root = Tk()
root.geometry("270x380")

#Ueberschrift
label1=Label(root)
ft = tkFont.Font(family='Arial',size=18)
label1["font"] = ft
label1["fg"] = "#333333"
label1["justify"] = "left"
label1["text"] = "Auswahl:"
label1.place(x=30,y=20)

#Auswahl Menue
vlist = ["jpg", "JPG", "jpeg", "JPEG", "png", "PNG"]
Combo = ttk.Combobox(root, values = vlist, state="readonly")
Combo.set("Format")
Combo.place(x=30, y=50)

#Text Verzeichnis
label5=Label(root, text="Verzeichnis:")
label5["font"]= ft
label5.place(x=30, y=80)

#Verzeichnis Button
button = Button(root, text = "Verzeichnis auswählen", width=18,padx=0 , command = DIR)
button.place(x=30, y=110)

#Namenszusatz
label2=Label(root, text="Namenszusatz:")
label2["font"] = ft
label2.place(x=30, y=150)

#Eingabefeld
zusatz = Entry(root,relief=SUNKEN,state=NORMAL, width = 20)
zusatz.insert(0,'...')
zusatz.place(x=30, y=180)

#Ausgabequalität
label3 = Label(root, text="Ausgabequalität:")
label3["font"] = ft
label3.place(x=30, y=220)
Scala2 = Scale(root, from_=0, to=100, length = 200, tickinterval = 50, orient=HORIZONTAL, sliderlength = 15)
Scala2.place(x=30, y=250)

#StartButton
button = Button(root, text = "Start", command = START)
button.place(x=30, y=320)

#ExitButton
button1 = Button(root, text = "Ende", command = root.destroy)
button1.place(x=165, y=320)

# Menueleiste
mainmenu = Menu(root)
 
# Menue 1
filemenu = Menu(mainmenu, tearoff = 0)
filemenu.add_command(label = "Programm beenden", command = root.destroy)
mainmenu.add_cascade(label="Weg mit den Exifs", menu=filemenu)
 
# Menue 2
helpmenu = Menu(mainmenu, tearoff = 0)
helpmenu.add_command(label = "Anleitung", command = ANLEI)
helpmenu.add_command(label = "Über", command = UEBER)
mainmenu.add_cascade(label = "Hilfe", menu = helpmenu)

root.config(menu = mainmenu)
root.title("Weg mit den Exifs")
root.mainloop()

Die Textdatei: (Anleitung.txt)

Dieses Programm dient dem löschen von Exif Daten aus Bilddateien.
Außerdem kann man auch PNGs einlesen, um diese zu komprimieren.
1. Zuerst wird das Dateiformat über das Dropdown Menue ausgewählt.
2. Jetzt muss das Verzeichnis, in dem die Dateien liegen, ausgewählt werden.
3. Um das Überschreiben der Originaldatei zu verhindern, muss ein Namenszusatz eingeben werden.
4. Hier wird die Ausgabequalität der neuen Datei ausgewählt.

Und so sieht es dann aus, wenn alles funktioniert :-)

Weg mit den Exils beta 0.1

Video (1,4MB)