-
Notifications
You must be signed in to change notification settings - Fork 0
/
imageDisplay.py
109 lines (86 loc) · 4.27 KB
/
imageDisplay.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import customtkinter as ctk
from tkinter import Event
from PIL import Image, ImageTk
from imageInfo import ImageInfo
from imageList import ImageList
from imageView import ImageView
from exiftool import ExifToolHelper
class ImageDisplay:
def __init__(self, root: ctk.CTkFrame, images: list, changeToPathSelection : callable = None, changeToImageList : callable = None) -> None:
self.root = root
self.root.grid_rowconfigure(0, weight=2)
self.root.grid_rowconfigure(1, weight=15)
self.root.grid_rowconfigure(2, weight=0)
self.root.grid_columnconfigure(0, weight=1)
self.root.grid_columnconfigure(1, weight=5)
self.images = images
self.changeToPathSelection = changeToPathSelection if changeToPathSelection else lambda: None
self.changeToImageList = changeToImageList if changeToImageList else lambda: None
self.current_index_var = ctk.IntVar()
self.image_info = None
self.image_list = None
self.image_view = None
self.create_widgets()
def next_image(self):
self.current_index_var.set(min(self.current_index_var.get() + 1, len(self.images) - 1))
self.refresh_image_list()
self.refresh_image_view()
self.refresh_image_info()
def previous_image(self):
self.current_index_var.set(max(self.current_index_var.get() - 1, 0))
self.refresh_image_list()
self.refresh_image_view()
self.refresh_image_info()
def create_widgets(self):
self.padding = 5
self.image_info_frame = ctk.CTkFrame(self.root)
self.image_info_frame.grid(row=0, column=0, sticky="nsew", padx=self.padding, pady=self.padding)
self.control_frame = ctk.CTkFrame(self.root)
self.control_frame.grid(row=2, column=0, sticky="nsew", padx=self.padding, pady=self.padding)
self.image_view_frame = ctk.CTkFrame(self.root)
self.image_view_frame.grid(row=0, column=1, rowspan=3, sticky="nsew", padx=self.padding, pady=self.padding)
self.image_list_frame = ctk.CTkFrame(self.root)
self.image_list_frame.grid(row=1, column=0, sticky="nsew", padx=self.padding, pady=self.padding)
self.create_image_info()
self.create_image_list()
self.create_image_view()
self.create_control()
def create_image_info(self):
self.image_info = ImageInfo(self.image_info_frame, self.images, self.current_index_var)
def create_image_list(self):
self.image_list = ImageList(self.image_list_frame, self.images, self.current_index_var, self.refresh_new_image_selection)
def create_image_view(self):
self.image_view = ImageView(self.image_view_frame, self.images, self.current_index_var)
def refresh_image_info(self):
if self.image_info != None:
self.image_info.update_exif_data()
def refresh_image_list(self):
if self.image_list != None:
self.image_list.refresh_metadata()
def refresh_image_view(self):
if self.image_view != None:
self.image_view.create_widgets()
def refresh_new_image_selection(self):
print("Refresh due to new image selection to " + str(self.current_index_var.get()))
self.refresh_image_info()
self.refresh_image_view()
def create_control(self):
self.button_path_selection = ctk.CTkButton(self.control_frame, text="Path Selection", command=self.changeToPathSelection)
self.button_path_selection.place(relx=0.5, rely=0.5, anchor="center")
def change_rating(self, rating: int):
with ExifToolHelper() as et:
et.set_tags(
[self.images[self.current_index_var.get()][1], self.images[self.current_index_var.get()][1].replace(".JPG", ".CR3")],
tags={"Rating": rating},
params=["-P", "-overwrite_original"]
)
print(f"Rating of {self.images[self.current_index_var.get()][1]} changed to {rating}")
self.refresh_image_info()
self.refresh_image_list()
if __name__ == "__main__":
from imageApp import ImageApp
root = ctk.CTk()
root.title("Image Viewer")
app = ImageApp(root, "~/Pictures")
app.create_widgets()
root.mainloop()