101 lines
3.3 KiB
Python
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()
|