import ttkbootstrap as tb
from ttkbootstrap.constants import *
import tkinter as tk
from tkinter import messagebox
import subprocess
import threading
import sys
# Danh sách addons với cấu trúc {"name": ..., "script": ...}
addons = [
{"name": "Flask", "script": "pip install flask"},
{"name": "Keyboard", "script": "pip install keyboard"},
{"name": "PY Auto GUI", "script": "pip install pyautogui"},
{"name": "Requests", "script": "pip install requests"},
{"name": "Beautiful Soup 4", "script": "pip install beautifulsoup4"},
{"name": "Pillow", "script": "pip install pillow"},
{"name": "PyperClip", "script": "pip install pyperclip"},
{"name": "Google Search", "script": "pip install googlesearch-python"},
{"name": "Wikipedia", "script": "pip install wikipedia"},
{"name": "PyInstaller", "script": "pip install pyinstaller"},
{"name": "Custom Tkinter", "script": "pip install customtkinter"},
{"name": "TTK Bootstrap", "script": "pip install ttkbootstrap"},
{"name": "Webdriver Manager", "script": "pip install webdriver-manager"},
{"name": "FFmpeg Python", "script": "pip install ffmpeg-python git+https://github.com/openai/whisper.git"},
{"name": "Whisper", "script": "pip install whisper"},
{"name": "Google Translate", "script": "pip install googletrans==4.0.0-rc1"},
{"name": "OpenAI Whisper", "script": "pip install openai-whisper"},
{"name": "MoviePY", "script": "pip install moviepy"},
{"name": "SRT", "script": "pip install srt"},
{"name": "Selenium", "script": "pip install selenium"},
{"name": "ImageIO FFmpeg", "script": "pip install imageio[ffmpeg]"},
{"name": "YT-DLP", "script": "pip install yt-dlp"},
{"name": "GDown", "script": "pip install gdown"},
{"name": "Browser Cookie 3", "script": "pip install browser-cookie3"},
{"name": "Torch", "script": "pip install torch"},
{"name": "Torch Vision", "script": "pip install torchvision"},
{"name": "Torch Audio", "script": "pip install torchaudio --index-url https://download.pytorch.org/whl/cu118"},
{"name": "Pytesseract", "script": "pip install pytesseract"},
{"name": "Pynput", "script": "pip install pynput"},
{"name": "OpenCV Python", "script": "pip install opencv-python"},
{"name": "Sound Device", "script": "pip install sounddevice"},
{"name": "Numpy", "script": "pip install numpy"},
{"name": "Vosk", "script": "pip install vosk"},
{"name": "Python Dateutil", "script": "pip install python-dateutil"},
{"name": "ISO Date", "script": "pip install isodate"},
{"name": "Google Auth & Client", "script": "pip install --upgrade google-auth-oauthlib google-api-python-client"},
{"name": "Win 10 Toast & Sound", "script": "pip install win10toast playsound==1.2.2"},
{"name": "Transformers", "script": "pip install -U transformers"},
{"name": "Sentence Piece", "script": "pip install sentencepiece"},
{"name": "TQDM", "script": "pip install tqdm"},
{"name": "PY MySQL", "script": "pip install pymysql"},
]
install_thread = None
stop_install = False
# Hàm cài addon
def install_selected():
global install_thread, stop_install
stop_install = False
selected_indices = addon_listbox.curselection()
if not selected_indices:
messagebox.showwarning("Cảnh báo", "Vui lòng chọn ít nhất một addon để cài đặt!")
return
selected_addons = [addons[i] for i in selected_indices]
progress_bar["maximum"] = len(selected_addons)
progress_bar["value"] = 0
install_thread = threading.Thread(target=run_install, args=(selected_addons,))
install_thread.start()
def run_install(selected_addons):
global stop_install
for i, addon in enumerate(selected_addons, start=1):
if stop_install:
break
try:
log_text.insert(tk.END, f"Đang cài đặt: {addon['name']}...\n")
log_text.see(tk.END)
subprocess.run(addon["script"].split(), capture_output=False)
log_text.insert(tk.END, f"✅ Hoàn tất: {addon['name']}\n")
except Exception as e:
log_text.insert(tk.END, f"❌ Lỗi khi cài {addon['name']}: {e}\n")
log_text.see(tk.END)
progress_bar["value"] = i
log_text.insert(tk.END, "\n🎉 Hoàn tất quá trình cài đặt.\n")
def stop_install_process():
global stop_install
stop_install = True
log_text.insert(tk.END, "\n⏹ Quá trình cài đặt đã bị dừng.\n")
log_text.see(tk.END)
# Hàm chọn tất cả addons
def select_all():
addon_listbox.select_set(0, tk.END)
def deselect_all():
addon_listbox.selection_clear(0, tk.END)
def center_window(root, width=600, height=500):
# Lấy kích thước màn hình
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# Tính vị trí bắt đầu trục ngang và trục đứng
aaaxxx = (screen_width // 2) - (width // 2)
bbbyyy = (screen_height // 2) - (height // 2) - (40)
# Đặt geometry
root.geometry(f"{width}x{height}+{aaaxxx}+{bbbyyy}")
# Giao diện chính
app = tb.Window(themename="cosmo") # giao diện nhẹ hơn
app.title("Python Addons Installer - DarkCorners")
center_window(app, 600, 500)
# Hàng 1: Tiêu đề
title_label = tb.Label(app, text="🐍 Python Addons Installer", font=("Arial", 16, "bold"), bootstyle="info")
title_label.pack(pady=10)
# Hàng 2: Danh sách addons với Listbox thay vì nhiều Checkbutton
addons_frame = tb.Labelframe(app, text="DANH SÁCH ADDONS", bootstyle="primary", padding=5)
addons_frame.pack(fill="both", expand=True, padx=10, pady=5)
listbox_frame = tk.Frame(addons_frame)
listbox_frame.pack(fill="both", expand=True)
scrollbar = tk.Scrollbar(listbox_frame, orient="vertical")
addon_listbox = tk.Listbox(listbox_frame, selectmode="multiple", yscrollcommand=scrollbar.set, bg="#1e1e1e", fg="white")
scrollbar.config(command=addon_listbox.yview)
for addon in addons:
addon_listbox.insert(tk.END, addon["name"])
addon_listbox.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
# Hàng 3: Điều khiển
control_frame = tb.Frame(app)
control_frame.pack(fill="x", padx=10, pady=5)
tb.Button(control_frame, text="Bắt Đầu", bootstyle="success-outline", command=install_selected).pack(side="left", padx=5)
tb.Button(control_frame, text="Dừng", bootstyle="danger-outline", command=stop_install_process).pack(side="left", padx=5)
tb.Button(control_frame, text="Chọn tất cả", bootstyle="info-outline", command=select_all).pack(side="left", padx=5)
tb.Button(control_frame, text="Bỏ chọn tất cả", bootstyle="secondary-outline", command=deselect_all).pack(side="left", padx=5)
tb.Button(control_frame, text="Thoát", bootstyle="warning-outline", command=app.destroy).pack(side="right", padx=5)
# Thanh tiến trình
progress_bar = tb.Progressbar(app, mode="determinate", bootstyle="info-striped")
progress_bar.pack(fill="x", padx=10, pady=5)
# Khung log
log_text = tk.Text(app, height=8, bg="#1e1e1e", fg="white", insertbackground="white")
log_text.pack(fill="both", padx=10, pady=5)
app.mainloop()