└── Project1.py /Project1.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | 4 | from PIL import Image, ImageTk 5 | from PIL.ExifTags import TAGS #for converting strings 6 | 7 | import tkinter 8 | from tkinter import ttk, filedialog#allows to open files and folders 9 | 10 | 11 | class App: 12 | #first method to be runned 13 | def __init__(self,master): 14 | self.master = master 15 | self.drawBoard() #calling drawBoard 16 | 17 | #passing all the widget needs for this appp 18 | def drawBoard(self): 19 | self.photo_frame = ttk.Frame(self.master, width=850,height=650)#holds img 20 | self.photo_frame.pack(side='left',padx=50,fill='x',expand=True) 21 | self.photo_frame.pack_propagate(False) #avoid auto_resize#pack_propagate is used to avoid shrinkage of frame 22 | 23 | self.content_frame = ttk.Frame(self.master, width=400,height=350) 24 | self.content_frame.pack(side='left',padx=20,fill='x',expand=True) 25 | self.content_frame.pack_propagate(False) 26 | 27 | self.image_label = ttk.Label(self.photo_frame)#holds the img 28 | self.image_label.pack(anchor='sw') 29 | 30 | self.open_button = ttk.Button(self.photo_frame, text='open',command=self.openFolder) 31 | self.open_button.pack(side='left',anchor='sw') 32 | 33 | self.close_button = ttk.Button(self.photo_frame, text='close',command=self.master.destroy) 34 | self.close_button.pack(side='left',anchor='sw') 35 | 36 | self.back_button = ttk.Button(self.photo_frame, text='<',state='disabled',command=self.moveBackward) 37 | self.back_button.pack(side='left',anchor='sw') 38 | 39 | self.forward_button = ttk.Button(self.photo_frame, text='>',state='disabled',command=self.moveForward) 40 | self.forward_button.pack(side='left',anchor='sw') 41 | 42 | self.meta_button = ttk.Button(self.photo_frame, text='meta',state='disabled',command=self.extractMeta) 43 | self.meta_button.pack(side='left',anchor='sw') 44 | 45 | def openFolder(self): 46 | #try and catch block is used to throw exception 47 | try: 48 | self.folder = filedialog.askdirectory(title='Open a folder',initialdir= 'C:\\Users\\nandh\\OneDrive\\Pictures') 49 | self.image_list = os.listdir(self.folder) 50 | self.new_image_list = [img for img in self.image_list if img.endswith('jpg') or img.endswith('JPG') or img.endswith('png') or img.endswith('JPEG') or img.endswith('jpeg')] 51 | self.loadImage() 52 | self.forward_button.state(['!disabled']) 53 | self.meta_button.state(['!disabled']) 54 | 55 | except FileNotFoundError: 56 | self.pop_up = tkinter.Toplevel(master) 57 | self.pop_up.title('alert') 58 | self.pop_up.geometry('225x125+650+300') 59 | self.pop_up.resizable(False, False) 60 | self.pop_up.lift(master) 61 | 62 | ttk.Label(self.pop_up, text='operation cancelled', background='light blue').pack(padx=20, pady=25) 63 | ttk.Button(self.pop_up, text='Ok', command=self.pop_up.destroy).pack(padx=10, pady=5) 64 | 65 | 66 | def loadImage(self, image_counter=0): 67 | self.image_counter = image_counter 68 | self.image = self.folder + '/' + self.new_image_list[self.image_counter]#folder give path #list gives 1st img in list 69 | width, height = Image.open(self.image).size 70 | 71 | if width > height: 72 | self.image_resized = Image.open(self.image).resize((850,550)) 73 | else: 74 | self.image_resized = Image.open(self.image).resize((450,600)) 75 | 76 | self.load_image = ImageTk.PhotoImage(self.image_resized) 77 | self.image_label.image = self.load_image 78 | self.image_label.config(image=self.image_label.image) 79 | def moveForward(self): 80 | self.clearMeta() 81 | self.image_counter +=1 82 | self.loadImage(self.image_counter) 83 | self.back_button.state(['!disabled']) 84 | if self.image_counter +1 == len(self.new_image_list): 85 | self.forward_button.state(['disabled']) 86 | 87 | def moveBackward(self): 88 | self.clearMeta() 89 | self.image_counter -=1 90 | self.loadImage(self.image_counter) 91 | if self.image_counter == 0: 92 | self.back_button.state(['disabled']) 93 | self.forward_button.state(['!disabled']) 94 | 95 | def clearMeta(self): 96 | if self.content_frame.pack_slaves(): 97 | for widget in self.content_frame.pack_slaves(): 98 | widget.destroy() 99 | 100 | def extractMeta(self): 101 | self.clearMeta() 102 | file = Image.open(self.image) 103 | data = file.getexif() 104 | if data: 105 | for key, val in data.items(): 106 | string = TAGS.get(key) 107 | labeltext = '{} : {}'.format(string, val) 108 | ttk.Label(self.content_frame, text=labeltext).pack(anchor='sw',padx=20, pady=3) 109 | else: 110 | ttk.Label(self.content_frame, text='no metadata found').pack(anchor='sw',padx=20, pady=3) 111 | 112 | if __name__ == '__main__': 113 | master = tkinter.Tk() 114 | App(master) 115 | master.title('Crystal Ball') 116 | master.geometry('1350x750+125+50') 117 | master.mainloop() --------------------------------------------------------------------------------