From e2b51f8b00b837b92e3b591e4d2ce795cbc92162 Mon Sep 17 00:00:00 2001 From: Clement Desmidt Date: Mon, 22 May 2023 17:50:05 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Goes=20to=20class=20and=20?= =?UTF-8?q?first=20image=20displayed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++ image.py | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 69 ++++++++------------------------------------- util.py | 24 ++++++++++++++++ 4 files changed, 192 insertions(+), 57 deletions(-) create mode 100644 app.py create mode 100644 image.py create mode 100644 util.py diff --git a/app.py b/app.py new file mode 100644 index 0000000..bc7c1db --- /dev/null +++ b/app.py @@ -0,0 +1,71 @@ +from tkinter import * +from tkinter import filedialog +from pathlib import Path +from util import Util +from functools import partial +from image import ImageWindow + + +class App: + def __init__(self, root): + super().__init__() + self.selected_folder = "" + self.found_images = [] + self.timer = 0 + self.title = Label(root, text="Drawing Training") + self.title.pack() + + self.folder_selector = Button(root, text="Select a folder", command=self.select_folder) + self.folder_selector.pack() + + self.folder_name = Label(root, text="Folder : " + self.selected_folder) + self.folder_name.pack() + + self.images_len = Label(root, text="Found : " + str(len(self.found_images))) + self.images_len.pack() + + self.button_frame = Frame(root) + self.button_frame.pack(fill=X) + + timers = [30, 45, 60, 120, 300, 600] + self.buttons = [] + i = 0 + for i in timers: + t = i + new_button = Button(self.button_frame, text=Util.format_seconds(t), + command=partial(self.set_timer_in_seconds, t)) + # new_button.pack(side="left") + self.buttons.append(new_button) + self.button_frame.columnconfigure(i, weight=1) + new_button.grid(row=0, column=i, sticky=W + E) + i += 1 + + self.launch_button = Button(root, text="Let's draw!", command=self.lets_draw, state="disabled") + self.launch_button.pack(side="bottom") + self.image_window = ImageWindow(root) + + def lets_draw(self): + self.image_window.lets_draw(self.found_images, self.timer) + + def select_folder(self): + self.selected_folder = filedialog.askdirectory() + self.found_images = list( + p.resolve() for p in Path(self.selected_folder).glob("**/*") if p.suffix in {".jpg", ".gif", ".png"}) + self.folder_name.config(text="Folder : " + self.selected_folder) + self.images_len.config(text="Found : " + str(len(self.found_images))) + self.check_lets_draw() + + def check_lets_draw(self): + if self.selected_folder != "" and len(self.found_images) > 0 and self.timer != 0: + self.launch_button.config(state="normal") + else: + self.launch_button.config(state="disabled") + + def set_timer_in_seconds(self, user_data): + self.timer = user_data + for button in self.buttons: + if button['text'] == Util.format_seconds(self.timer): + button.config(bg="blue") + else: + button.config(bg="gray85") + self.check_lets_draw() diff --git a/image.py b/image.py new file mode 100644 index 0000000..ac23f61 --- /dev/null +++ b/image.py @@ -0,0 +1,85 @@ +import random +from tkinter import * +from PIL import ImageTk, Image + + +class ImageWindow: + def __init__(self, window): + self.window = Toplevel(window) + self.window.title("Image") + self.window.geometry("1280x1024") + self.images = [] + self.timer = 0 + self.timer_label = None + self.timer_check = None + + @staticmethod + def maintain_aspect_ratio(event, aspect_ratio): + new_width = event.width + new_height = event.height + + new_aspect_ratio = new_width / new_height + + # Decide which dimension controls. + if new_aspect_ratio > aspect_ratio: + # Use width as the controlling dimension. + desired_width = new_width + desired_height = int(new_width / aspect_ratio) + else: + # Use height as the controlling dimension. + desired_height = new_height + desired_width = int(new_height * aspect_ratio) + + event.widget.resize(f'{desired_width}x{desired_height}') + # Override if necessary. + # if new_width != desired_width or new_height != desired_height: + # # Manually give it the proper dimensions. + # return "break" # Block further processing of this event. + + def update_timer(self, current): + current -= 1 + if current > 0: + self.timer_label.configure(text=current) + self.timer_check = self.window.after(1000, self.update_timer, current) + else: + self.window.after_cancel(self.timer_check) + + def lets_draw(self, images, timer): + self.images = images + self.timer = timer + + canvas = Canvas(self.window) + canvas.pack(fill=BOTH, expand=1) + + self.timer_label = Label(self.window, text="") + self.timer_label.pack(side=BOTTOM) + + random.shuffle(self.images) + + image_timer = timer + + self.display_new_image() + timer_check = self.window.after(1000, self.update_timer, image_timer) + + def display_new_image(self): + ma = self.window.winfo_toplevel() + w, h = ma.winfo_width(), ma.winfo_height() + + image_path = self.images[0] + self.images.pop(0) + image = Image.open(image_path) + + if image.size[0] > w or image.size[1] > h: + if w < 3 or h < 3: # too small + return # do nothing + image.thumbnail((w - 2, h - 2), Image.ANTIALIAS) + print("resized: win %s >= img %s", (w, h), image.size) + + image_to_display = ImageTk.PhotoImage(image) + + image_label = Label(self.window, image=image_to_display) + # image_label.bind('', lambda event: self.maintain_aspect_ratio(event, 1280 / 1024)) + image_label.image = image_to_display + image_label.pack(side="top", fill="both", expand=1) + # Position image + # image_label.place(x=0, y=0) diff --git a/main.py b/main.py index a96f760..65c674c 100644 --- a/main.py +++ b/main.py @@ -1,61 +1,16 @@ -import dearpygui.dearpygui as dpg -from pathlib import Path - -dpg.create_context() - -selected_folder = "" -found_images = [] -timer = 0 - -with dpg.theme() as blue_theme: - with dpg.theme_component(dpg.mvAll): - dpg.add_theme_color(dpg.mvThemeCol_FrameBg, (0, 0, 200), category=dpg.mvThemeCat_Core) +from tkinter import * +from app import App -def setTimerInSeconds(sender, app_data, user_data): - timer=user_data - print(sender) - print(dpg.get_item_theme(sender)) - dpg.bind_item_theme(sender, blue_theme) - print(dpg.get_item_theme(sender)) +def main(): + root = Tk() + root.title("Drawing Training!") + root.geometry("300x600") + + app = App(root) + + root.mainloop() -def callback(sender, app_data): - selected_folder = app_data['file_path_name'] - found_images = list(p.resolve() for p in Path(selected_folder).glob("**/*") if p.suffix in {".jpg", ".gif", ".png"}) - dpg.set_value("folder_text", "Folder : " + selected_folder) - dpg.set_value("found_images_text", "Found : " + str(len(found_images))) - print('OK was clicked.') - print("Sender: ", sender) - print("App Data: ", app_data) - - -def cancel_callback(sender, app_data): - print('Cancel was clicked.') - print("Sender: ", sender) - print("App Data: ", app_data) - - -with dpg.file_dialog(directory_selector=True, show=False, callback=callback, tag="file_dialog_id", - cancel_callback=cancel_callback, width=700, height=400): - dpg.add_file_extension("Images (*.jpg *.gif *.png){.jpg,.gif,.png}", color=(0, 255, 255, 255)) - -with dpg.window(label="Drawing Training", width=300, height=800, pos=(0, 0), no_title_bar=True): - dpg.add_text("Drawing Training") - dpg.add_button(label="Select a folder", callback=lambda: dpg.show_item("file_dialog_id")) - dpg.add_text("Folder : " + selected_folder, tag="folder_text") - dpg.add_text("Found : " + str(len(found_images)), tag="found_images_text") - with dpg.group(horizontal=True): - dpg.add_button(label="30s", callback=setTimerInSeconds, user_data=30, tag="timer_30") - dpg.add_button(label="45s", callback=setTimerInSeconds, user_data=45, tag="timer_45") - dpg.add_button(label="1m", callback=setTimerInSeconds, user_data=1*60, tag="timer_60") - dpg.add_button(label="2m", callback=setTimerInSeconds, user_data=2*60, tag="timer_120") - dpg.add_button(label="5m", callback=setTimerInSeconds, user_data=5*60, tag="timer_300") - dpg.add_button(label="10m", callback=setTimerInSeconds, user_data=10*60, tag="timer_600") - dpg.add_button(label="Let's draw!") - -dpg.create_viewport(title='Drawing Training', width=300, height=600) -dpg.setup_dearpygui() -dpg.show_viewport() -dpg.start_dearpygui() -dpg.destroy_context() +if __name__ == '__main__': + main() diff --git a/util.py b/util.py new file mode 100644 index 0000000..327d844 --- /dev/null +++ b/util.py @@ -0,0 +1,24 @@ +class Util: + @staticmethod + def format_seconds(seconds): + hours = None + minutes = seconds / 60 + if minutes >= 1: + if minutes >= 60: + hours = int(minutes / 60) + minutes = int(minutes % 60) + else: + minutes = int(minutes) + seconds = seconds % 60 + else: + minutes = None + + time = "" + if hours is not None and hours != 0: + time += str(hours) + "h" + if minutes is not None and minutes != 0: + time += str(minutes) + "m" + if seconds is not None and seconds != 0: + time += str(seconds) + "s" + + return time