|
1 | 1 | import tkinter as tk |
2 | 2 | from PIL import Image, ImageTk |
3 | 3 |
|
| 4 | +from resource_utils import resource_path |
| 5 | + |
| 6 | +DEFAULT_CLOTH_DIAGRAM_SCALE = 1.0 |
| 7 | +DEFAULT_CLOTH_DOT_RADIUS = 7 |
| 8 | + |
4 | 9 |
|
5 | 10 | class ClothApp: |
6 | | - def __init__(self, master, on_close_callback): |
| 11 | + def __init__( |
| 12 | + self, |
| 13 | + master, |
| 14 | + on_close_callback, |
| 15 | + initial_points=None, |
| 16 | + diagram_scale=DEFAULT_CLOTH_DIAGRAM_SCALE, |
| 17 | + dot_radius=DEFAULT_CLOTH_DOT_RADIUS, |
| 18 | + ): |
7 | 19 | # Vytvoření nového okna pomocí Toplevel |
8 | 20 | self.top_level = tk.Toplevel(master) |
9 | 21 | self.top_level.title("Clothes App") |
10 | | - self.top_level.geometry("225x348") # Double the original dimensions for the window size |
11 | 22 | self.on_close_callback = on_close_callback |
| 23 | + self.diagram_scale = float(diagram_scale) |
| 24 | + self.dot_radius = int(dot_radius) |
12 | 25 |
|
13 | | - self.f = tk.Frame(self.top_level, bg='red') |
| 26 | + self.f = tk.Frame(self.top_level, bg='lightgrey') |
14 | 27 | self.f.grid(row=1, column=0, sticky="nsew") |
15 | 28 |
|
16 | 29 | self.dots = {} |
17 | | - self.img = Image.open("icons/diagram.png") |
18 | | - self.img = self.img.resize((int(self.img.width*0.5), int(self.img.height*0.5)), Image.LANCZOS) |
| 30 | + self.img = Image.open(resource_path("icons/diagram.png")) |
| 31 | + self.img = self.img.resize( |
| 32 | + (int(self.img.width * self.diagram_scale), int(self.img.height * self.diagram_scale)), |
| 33 | + Image.LANCZOS, |
| 34 | + ) |
19 | 35 | self.photo2 = ImageTk.PhotoImage(self.img) |
20 | | - self.canvas2 = tk.Canvas(self.f, width=self.img.width, height=self.img.height, bg='red') |
| 36 | + self.canvas2 = tk.Canvas(self.f, width=self.img.width, height=self.img.height, bg='lightgrey') |
21 | 37 |
|
22 | | - self.canvas2.pack() |
| 38 | + self.canvas2.pack(padx=10, pady=10) |
23 | 39 | self.canvas2.create_image(0, 0, anchor="nw", image=self.photo2) |
24 | 40 | self.canvas2.bind("<Button-1>", self.add_dot) # Left click to add a dot |
25 | 41 | self.canvas2.bind("<Button-2>", self.remove_dot) # Middle click to remove a dot |
26 | 42 | self.top_level.protocol("WM_DELETE_WINDOW", self.on_close) |
27 | 43 |
|
| 44 | + if initial_points: |
| 45 | + for x, y in initial_points: |
| 46 | + self._create_dot(x, y) |
| 47 | + |
| 48 | + win_w = self.img.width + 20 |
| 49 | + win_h = self.img.height + 20 |
| 50 | + self.top_level.geometry(f"{win_w}x{win_h}") |
| 51 | + |
28 | 52 | def on_close(self): |
29 | 53 | # Callback with dots data on close |
30 | | - self.on_close_callback(self.dots) |
| 54 | + self.on_close_callback(self.dots, self.diagram_scale) |
31 | 55 | self.top_level.destroy() |
32 | 56 |
|
| 57 | + def _create_dot(self, x, y): |
| 58 | + dot_id = self.canvas2.create_oval( |
| 59 | + x - self.dot_radius, |
| 60 | + y - self.dot_radius, |
| 61 | + x + self.dot_radius, |
| 62 | + y + self.dot_radius, |
| 63 | + fill="red", |
| 64 | + ) |
| 65 | + self.dots[dot_id] = (x, y) |
| 66 | + return dot_id |
| 67 | + |
33 | 68 | def add_dot(self, event): |
34 | | - dot_id = self.canvas2.create_oval(event.x-5, event.y-5, event.x+5, event.y+5, fill="red") |
35 | | - self.dots[dot_id] = (event.x, event.y) |
| 69 | + self._create_dot(event.x, event.y) |
36 | 70 | print("INFO: Clothes dots: ", self.dots) |
37 | 71 |
|
38 | 72 | def remove_dot(self, event): |
|
0 commit comments