thread4/navegadores/chrome.py

101 lines
3.3 KiB
Python

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("<Return>", 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()