-
Notifications
You must be signed in to change notification settings - Fork 0
/
imageView.py
92 lines (71 loc) · 2.67 KB
/
imageView.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
import customtkinter as ctk
from tkinter import Event
from PIL import Image, ImageTk
from util import rotate_image
SCALE_FACTOR = 1.2
class ImageView:
def __init__(self, root : ctk.CTkFrame, images : list[tuple[Image.Image, str]], curr_index_var : ctk.IntVar) -> None:
self.root = root
self.images = images
self.curr_index_var = curr_index_var
self.photo_image = None
self.zoomed_in = False
self.scale = 1.0
self.canvas = ctk.CTkCanvas(
root,
background='#3B3B3B',
borderwidth=0,
highlightthickness=0,
width=1920,
height=1080
)
self.canvas.bind("<Button-4>", self.zoom)
self.canvas.bind("<Button-5>", self.zoom)
self.canvas.bind("<MouseWheel>", self.zoom)
self.canvas.bind("<ButtonPress-1>", self.start_drag)
self.canvas.bind("<B1-Motion>", self.drag)
self.canvas.bind("<Double-Button-1>", self.double_click_zoom)
self.create_widgets()
def double_click_zoom(self, event: Event):
self.scale = 1.0
self.zoomed_in = False
self.create_widgets()
return
def zoom(self, event: Event):
if event.delta > 0 or event.num == 4:
self.scale *= SCALE_FACTOR
else:
self.scale /= SCALE_FACTOR
self.create_widgets()
def start_drag(self, event):
self.start_x = event.x
self.start_y = event.y
def drag(self, event):
delta_x = event.x - self.start_x
delta_y = event.y - self.start_y
self.start_x = event.x
self.start_y = event.y
self.canvas.move(self.image_id, delta_x, delta_y)
def resizing(self, event: Event):
if event.width > 1 and event.height > 1:
self.create_widgets()
def create_widgets(self):
self.canvas.delete(ctk.ALL)
self.canvas.pack(fill=ctk.BOTH, expand=True)
self.canvas.focus_set()
self.root.update()
height = self.root.winfo_height()
width = self.root.winfo_width()
img, img_path = self.images[self.curr_index_var.get()]
img = img.copy()
img = rotate_image(img)
img.thumbnail((width * self.scale, height * self.scale), Image.LANCZOS)
self.photo_image = ImageTk.PhotoImage(img)
self.image_id = self.canvas.create_image(width / 2, height / 2, anchor=ctk.CENTER, image=self.photo_image)
if __name__ == "__main__":
from imageApp import ImageApp
root = ctk.CTk()
root.title("Image Viewer")
app = ImageApp(root, "~/Pictures")
app.create_widgets()
root.mainloop()