import tkinter as tk
from tkinter import messagebox, filedialog
import os
import subprocess
import sqlite3
# ===== Emulator Configuration =====
EMULATOR_PATH = "emulator.exe" # Update with actual emulator exe
ROMS_FOLDER = "roms"
# ===== Database Setup =====
def init_db():
conn = sqlite3.connect("user_data.db")
cur = conn.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS favorites (
id INTEGER PRIMARY KEY,
rom TEXT UNIQUE
)
''')
conn.commit()
conn.close()
def add_favorite(rom):
conn = sqlite3.connect("user_data.db")
cur = conn.cursor()
try:
cur.execute("INSERT INTO favorites (rom) VALUES (?)", (rom,))
conn.commit()
except sqlite3.IntegrityError:
pass
conn.close()
def remove_favorite(rom):
conn = sqlite3.connect("user_data.db")
cur = conn.cursor()
cur.execute("DELETE FROM favorites WHERE rom=?", (rom,))
conn.commit()
conn.close()
def get_favorites():
conn = sqlite3.connect("user_data.db")
cur = conn.cursor()
cur.execute("SELECT rom FROM favorites")
favs = [row[0] for row in cur.fetchall()]
conn.close()
return favs
# ===== Launcher GUI =====
class GameLauncher:
def __init__(self, root):
self.root = root
self.root.title("š® Retro Arcade Launcher")
self.root.geometry("500x500")
self.favorites = get_favorites()
self.label = tk.Label(root, text="Available Games", font=("Arial", 14, "bold"))
self.label.pack(pady=10)
self.listbox = tk.Listbox(root, width=50, height=20)
self.populate_list()
self.listbox.pack()
btn_frame = tk.Frame(root)
btn_frame.pack(pady=10)
tk.Button(btn_frame, text="▶️ Play", command=self.launch_game).grid(row=0, column=0, padx=5)
tk.Button(btn_frame, text="⭐ Add Fav", command=self.add_to_favorites).grid(row=0, column=1, padx=5)
tk.Button(btn_frame, text="❌ Remove Fav", command=self.remove_from_favorites).grid(row=0, column=2, padx=5)
tk.Button(btn_frame, text="š Refresh", command=self.refresh).grid(row=0, column=3, padx=5)
def populate_list(self):
self.listbox.delete(0, tk.END)
if not os.path.exists(ROMS_FOLDER):
os.makedirs(ROMS_FOLDER)
files = [f for f in os.listdir(ROMS_FOLDER) if f.endswith((".nes", ".gba"))]
for f in files:
label = f + (" ⭐" if f in self.favorites else "")
self.listbox.insert(tk.END, label)
def get_selected_rom(self):
try:
selected = self.listbox.get(tk.ACTIVE)
return selected.replace(" ⭐", "")
except:
return None
def launch_game(self):
rom = self.get_selected_rom()
if not rom:
messagebox.showwarning("No Selection", "Please select a game.")
return
rom_path = os.path.join(ROMS_FOLDER, rom)
if not os.path.exists(EMULATOR_PATH):
messagebox.showerror("Emulator Not Found", "Update the emulator path in the code.")
return
subprocess.Popen([EMULATOR_PATH, rom_path])
print(f"Launching {rom}...")
def add_to_favorites(self):
rom = self.get_selected_rom()
if rom:
add_favorite(rom)
self.refresh()
def remove_from_favorites(self):
rom = self.get_selected_rom()
if rom:
remove_favorite(rom)
self.refresh()
def refresh(self):
self.favorites = get_favorites()
self.populate_list()
# === Main ===
if __name__ == "__main__":
init_db()
root = tk.Tk()
app = GameLauncher(root)
root.mainloop()