From c6c602f78ffa67866f47269f58d164baa58f77ae Mon Sep 17 00:00:00 2001 From: Sirin Puenggun Date: Mon, 8 May 2023 02:12:48 +0700 Subject: [PATCH] change lay/out, add progress bar/more responsive --- app.py | 97 ++++++++++++++++++++++++++++++++--------- resources/loading.gif | Bin 0 -> 9559 bytes resources/notfound.png | Bin 0 -> 18685 bytes 3 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 resources/loading.gif create mode 100644 resources/notfound.png diff --git a/app.py b/app.py index d7851cd..a12103a 100644 --- a/app.py +++ b/app.py @@ -1,15 +1,18 @@ import tkinter as tk +from tkinter import ttk import requests import io -from Essential.prepare_db import prepare_db from PIL import Image, ImageTk +from Essential.prepare_db import prepare_db from Essential.FoodSearch import FoodSearch - +import threading class App: def __init__(self, master): self.master = master + # Search food from database ----------------- + try: self.food_search = FoodSearch() except FileNotFoundError: @@ -19,39 +22,65 @@ class App: self.search_var = tk.StringVar() self.search_var.trace('w', self.search_callback) - self.search_entry = tk.Entry(self.master, textvariable=self.search_var) - self.search_entry.grid(row=0, column=0, padx=10, pady=10) + self.search_entry = ttk.Entry(self.master, textvariable=self.search_var) + self.search_entry.grid(row=0, column=0, padx=10, pady=10, sticky="nsew") - self.search_button = tk.Button(self.master, text="Search", command=self.search) - self.search_button.grid(row=1, column=0, padx=10, pady=10) + self.search_button = ttk.Button(self.master, text="Search", command=self.start_search) + self.search_button.grid(row=0, column=1, padx=10, pady=10, sticky="nsew") - self.results_frame = tk.Frame(self.master) - self.results_frame.grid(row=2, column=0, padx=10, pady=10, sticky="nsew") + self.results_frame = ttk.Frame(self.master) + self.results_frame.grid(row=1, column=0, padx=10, pady=10, sticky="nsew") - self.scrollbar = tk.Scrollbar(self.results_frame) - self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + self.scrollbar = ttk.Scrollbar(self.results_frame) + self.scrollbar.grid(row=0, column=2, sticky="ns") self.results_listbox = tk.Listbox(self.results_frame, yscrollcommand=self.scrollbar.set) - self.results_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + self.results_listbox.grid(row=0, column=0, columnspan=2, sticky="nsew") self.scrollbar.config(command=self.results_listbox.yview) self.selected_item = None - self.image_frame = tk.Frame(self.master, bg='white') - self.image_frame.grid(row=0, column=2, rowspan=3, padx=10, pady=10, sticky="nsew") + # Image of food ----------------- + + self.image_frame = ttk.Frame(self.master, borderwidth=2, relief=tk.SUNKEN) + self.image_frame.grid(row=2, column=0, padx=10, pady=10, sticky="nsew", columnspan=2) + self.image_frame.grid_rowconfigure(0, weight=1) + self.image_frame.grid_columnconfigure(0, weight=1) + + # Progress bar ----------------- + + self.progress_bar = ttk.Progressbar(self.master, mode='indeterminate') + self.progress_bar.grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky="we") + + # Default image (Not Found) ----------------- + + self.default_image_path = 'resources/notfound.png' # Replace with the correct path to your default image + self.default_image = ImageTk.PhotoImage(Image.open(self.default_image_path)) + self.default_image_label = ttk.Label(self.image_frame, image=self.default_image) + self.default_image_label.grid(row=0, column=0, padx=10, pady=10, sticky="nsew") self.master.columnconfigure(0, weight=1) self.master.columnconfigure(1, weight=0) - self.master.columnconfigure(2, weight=1) + self.master.rowconfigure(1, weight=1) self.master.rowconfigure(2, weight=1) + # Configure the window size and position + self.master.geometry("800x600") + # self.master.attributes('-fullscreen', True) + def search_callback(self, *args): pass + def start_search(self): + # Create a new thread to execute the search function + search_thread = threading.Thread(target=self.search) + search_thread.start() + def search(self): results = self.food_search.search(self.search_var.get()) - self.update_results(results) + # Call the update_results function on the main thread to update the GUI + self.master.after(0, self.update_results, results) def update_results(self, results): self.results_listbox.delete(0, tk.END) @@ -70,6 +99,8 @@ class App: self.selected_item = value self.show_image(self.selected_item) + # Image Showing Section ----------------- + def show_image(self, item): image_url = None for result in self.food_search.search(self.search_var.get()): @@ -78,25 +109,49 @@ class App: break if not image_url: + self.display_default_image() return + threading.Thread(target=self.fetch_and_display_image, args=(image_url,)).start() + + def fetch_and_display_image(self, image_url): + self.master.after(0, self.show_progress_bar) + + # Fetch the image response = requests.get(image_url) img_data = response.content img = Image.open(io.BytesIO(img_data)) img = img.resize((300, 300), Image.ANTIALIAS) img_tk = ImageTk.PhotoImage(img) - # remove old image label widget + self.master.after(0, self.hide_progress_bar) + + self.master.after(0, self.update_image_label, img_tk) + + def show_progress_bar(self): + self.progress_bar.start() + self.progress_bar.grid(row=3, column=1) + + def hide_progress_bar(self): + self.progress_bar.stop() + self.progress_bar.pack_forget() + + def display_default_image(self): + self.master.after(0, self.update_image_label, self.default_image) + + def update_image_label(self, image): + # Remove old image label widget for widget in self.image_frame.winfo_children(): widget.destroy() - self.image_frame.configure(bg='white') - label = tk.Label(self.image_frame, image=img_tk, bg='white') - label.image = img_tk - label.pack(fill=tk.BOTH, expand=True) + image_label = tk.Label(self.image_frame, image=image) + image_label.image = image + image_label.grid(row=0, column=2) + + # --------------------- + root = tk.Tk() app = App(root) -root.geometry("800x400") root.title('Food Search') app.results_listbox.bind('<>', app.on_item_selected) diff --git a/resources/loading.gif b/resources/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3302ca6d464f43562bbac8e9c1beb936adec3e5 GIT binary patch literal 9559 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 literal 0 HcmV?d00001 diff --git a/resources/notfound.png b/resources/notfound.png new file mode 100644 index 0000000000000000000000000000000000000000..0e609484f40b8dba3221e689340bcb4061707908 GIT binary patch literal 18685 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