message
message
import os
from tkinter import Tk, Label, Button, Entry, Text, Scrollbar, filedialog, Canvas,
Toplevel, Frame
from tkinter import messagebox, ttk
from tkinter.ttk import Progressbar
from websocket import WebSocketApp
import time
import threading
import websocket
class DatabaseSearcherNPY:
def __init__(self, root):
self.root = root
self.root.title("Database Searcher")
self.root.geometry("1000x700")
self.root.configure(bg="#ffffff")
# Configure la police
self.sf_pro = ("Helvetica Neue", "Arial")
# Main Container
self.main_frame = Frame(self.root, bg="#f5f5f7")
self.main_frame.place(relx=0.5, rely=0.5, anchor="center", width=900,
height=500)
# Border effect
self.main_frame.configure(highlightbackground="#E0E0E0",
highlightcolor="#E0E0E0",
highlightthickness=1,
bd=0)
# Folder Selection
self.folder_entry = Entry(self.search_frame, width=50,
font=(self.sf_pro[0], 12),
bg="#f5f5f7", fg="#000000", relief="flat")
self.folder_entry.place(x=20, y=15, width=600, height=30)
self.add_hover_effect(self.folder_entry)
self.browse_button = Button(self.search_frame, text="Browse",
command=self.browse_folder,
bg="#0071e3", fg="white", font=(self.sf_pro[0],
12, "bold"),
relief="flat", cursor="hand2")
self.browse_button.place(x=640, y=12, width=140, height=36)
self.add_button_effects(self.browse_button)
# Search Section
self.keyword_frame = Frame(self.main_frame, bg="#ffffff")
self.keyword_frame.place(x=50, y=110, width=800, height=60)
self.keyword_frame.configure(highlightbackground="#E8E8E8",
highlightcolor="#E8E8E8",
highlightthickness=1,
bd=0)
# Results Area
self.results_frame = Frame(self.main_frame, bg="#ffffff")
self.results_frame.place(x=50, y=190, width=800, height=250)
self.results_frame.configure(highlightbackground="#E8E8E8",
highlightcolor="#E8E8E8",
highlightthickness=1,
bd=0)
# Scrollbar
self.scrollbar = ttk.Scrollbar(self.results_frame,
command=self.results_text.yview)
self.scrollbar.place(x=780, y=0, height=250)
self.results_text.config(yscrollcommand=self.scrollbar.set)
def animate(step):
if step < steps:
x = start_x + (dx * step)
y = start_y + (dy * step)
widget.place(x=x, y=y)
self.root.after(duration // steps, lambda: animate(step + 1))
animate(0)
button.bind("<Enter>", on_enter)
button.bind("<Leave>", on_leave)
button.bind("<Button-1>", on_click)
def splash_screen(self):
"""Écran de démarrage avec animation simple"""
splash = Toplevel(self.root)
splash.geometry("1000x700")
splash.configure(bg="#ffffff")
splash.overrideredirect(True)
# Centrer la fenêtre
screen_width = splash.winfo_screenwidth()
screen_height = splash.winfo_screenheight()
x = (screen_width - 1000) // 2
y = (screen_height - 700) // 2
splash.geometry(f"1000x700+{x}+{y}")
self.root.withdraw()
slide_text()
# Progress bar
progress = ttk.Progressbar(splash, mode="indeterminate", length=400)
progress.place(relx=0.5, rely=0.7, anchor="center")
progress.start(15)
def close_splash():
progress.stop()
splash.destroy()
self.root.deiconify()
splash.after(2000, close_splash)
def browse_folder(self):
folder_path = filedialog.askdirectory()
if folder_path:
self.folder_entry.delete(0, "end")
self.folder_entry.insert(0, folder_path)
def start_search(self):
if not self.validate_inputs():
return
self.search_button.configure(state="disabled")
thread = threading.Thread(target=self.perform_search)
thread.daemon = True
thread.start()
def validate_inputs(self):
"""Valide les entrées avec effet de shake"""
folder_path = self.folder_entry.get()
keyword = self.keyword_entry.get()
self.progress["value"] = 0
self.results_text.config(state="normal")
self.results_text.delete(1.0, "end")
processed_files += 1
self.progress["value"] = (processed_files / total_files) * 100
self.root.update_idletasks()
self.results_text.config(state="disabled")
finally:
self.search_button.configure(state="normal")
self.progress["value"] = 100
if __name__ == "__main__":
root = Tk()
app = DatabaseSearcherNPY(root)
root.mainloop()