import tkinter as tk from tkinter import ttk from cefpython3 import cefpython as cef import sys class BrowserTab: def __init__(self, master, url="https://google.com"): self.frame = tk.Frame(master) self.frame.pack(fill=tk.BOTH, expand=True) # Inicializa la instancia de navegador CEF dentro del Frame window_info = cef.WindowInfo() window_info.SetAsChild(self.frame.winfo_id()) self.browser = cef.CreateBrowserSync(window_info, url=url) def navigate(self, url): # Navegar a una nueva URL self.browser.LoadUrl(url) def close(self): # Cerrar el navegador CEF en esta pestaña self.browser.CloseBrowser() class BrowserApp(tk.Tk): def __init__(self): super().__init__() # Configuración de la ventana principal self.title("Navegador Web con Tkinter y CEF") self.geometry("1024x768") # Mantener una lista de pestañas (para el control de las instancias de navegador) self.tabs = {} # Crear el contenedor de pestañas y la barra de URL self.create_ui() # Inicializar CEF cef.Initialize() def create_ui(self): # Frame superior para la barra de URL y los botones top_frame = tk.Frame(self, height=30) top_frame.pack(fill=tk.X) # Botón para nueva pestaña new_tab_btn = tk.Button(top_frame, text="Nueva Pestaña", command=self.new_tab) new_tab_btn.pack(side=tk.LEFT, padx=5) # Campo de entrada para la URL self.url_entry = tk.Entry(top_frame) self.url_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5) self.url_entry.bind("", self.load_url) # Ejecuta `load_url` al presionar Enter # Botón para cargar URL go_btn = tk.Button(top_frame, text="Ir", command=self.load_url) go_btn.pack(side=tk.LEFT, padx=5) # Crear el notebook para las pestañas self.notebook = ttk.Notebook(self) self.notebook.pack(fill=tk.BOTH, expand=True) # Agregar una pestaña inicial self.new_tab() def new_tab(self): # Crear un frame para una nueva pestaña tab_id = len(self.tabs) + 1 new_tab = BrowserTab(self.notebook) self.tabs[tab_id] = new_tab # Agregar la pestaña al notebook con la página predeterminada de Google self.notebook.add(new_tab.frame, text=f"Pestaña {tab_id}") self.notebook.select(new_tab.frame) # Seleccionar la nueva pestaña def load_url(self, event=None): # Cargar la URL en la pestaña seleccionada url = self.url_entry.get() if not url.startswith("http"): url = "http://" + url # Asegura el prefijo "http://" # Obtener la pestaña seleccionada selected_tab = self.notebook.select() for tab_id, tab in self.tabs.items(): if str(tab.frame) == selected_tab: tab.navigate(url) break def on_close(self): # Cierra todas las instancias de navegador al cerrar la aplicación for tab in self.tabs.values(): tab.close() cef.Shutdown() self.destroy() # Crear y ejecutar la aplicación if __name__ == "__main__": app = BrowserApp() app.protocol("WM_DELETE_WINDOW", app.on_close) # Cerrar adecuadamente la app y CEF app.mainloop()