From e87f33d1f94ed4dd2a8b1f9aec92ad77881480aa Mon Sep 17 00:00:00 2001 From: Kevin Date: Sat, 1 Feb 2025 02:02:58 +0100 Subject: [PATCH] Base del proyecto Creacion de los frames bases --- ControllerMain.py | 15 +++++ Main.py | 11 ++++ VistaMain.py | 57 +++++++++++++++++++ __pycache__/ControllerMain.cpython-313.pyc | Bin 0 -> 1609 bytes __pycache__/VistaMain.cpython-313.pyc | Bin 0 -> 4363 bytes models/Scraper.py | 63 +++++++++++++++++++++ models/Screen.py | 6 ++ models/__pycache__/Screen.cpython-313.pyc | Bin 0 -> 749 bytes zprueba.py | 15 +++++ 9 files changed, 167 insertions(+) create mode 100644 ControllerMain.py create mode 100644 Main.py create mode 100644 VistaMain.py create mode 100644 __pycache__/ControllerMain.cpython-313.pyc create mode 100644 __pycache__/VistaMain.cpython-313.pyc create mode 100644 models/Scraper.py create mode 100644 models/Screen.py create mode 100644 models/__pycache__/Screen.cpython-313.pyc create mode 100644 zprueba.py diff --git a/ControllerMain.py b/ControllerMain.py new file mode 100644 index 0000000..a8daf8d --- /dev/null +++ b/ControllerMain.py @@ -0,0 +1,15 @@ +from models.Screen import Modelo +from VistaMain import Vista + +class Controlador: + def __init__(self, modelo, vista): + self.modelo = modelo + self.vista = vista + + # Conectar los botones con sus respectivos frames + self.vista.button1.config(command=lambda: self.vista.mostrar_frame("frame1")) + self.vista.button2.config(command=lambda: self.vista.mostrar_frame("frame2")) + self.vista.button3.config(command=lambda: self.vista.mostrar_frame("frame3")) + + # Mostrar el frame inicial + self.vista.mostrar_frame("frame1") diff --git a/Main.py b/Main.py new file mode 100644 index 0000000..96eec2c --- /dev/null +++ b/Main.py @@ -0,0 +1,11 @@ +import tkinter as tk +from models.Screen import Modelo +from VistaMain import Vista +from ControllerMain import Controlador + +if __name__ == "__main__": + root = tk.Tk() + modelo = Modelo() + vista = Vista(root) + controlador = Controlador(modelo, vista) + root.mainloop() diff --git a/VistaMain.py b/VistaMain.py new file mode 100644 index 0000000..4842a07 --- /dev/null +++ b/VistaMain.py @@ -0,0 +1,57 @@ +import tkinter as tk +from tkinter import ttk + +class Vista: + def __init__(self, root): + self.root = root + self.root.title("Ventana con Botones y Frame") + self.root.geometry("1280x720") + self.root.configure(bg="#d3eaf2") + + self.crear_estilo() + self.crear_frames() + self.crear_botones() + + def crear_estilo(self): + self.style = ttk.Style() + self.style.configure("TButton", font=("Arial", 16), padding=10, background="#007acc", foreground="#ffffff") + self.style.map("TButton", background=[("active", "#005f99")], foreground=[("active", "#ffffff")]) + + def crear_frames(self): + self.main_frame = tk.Frame(self.root) + self.main_frame.pack(fill="both", expand=True) + + self.menu_frame = tk.Frame(self.main_frame, width=200, background="#f0f0f0", relief="sunken", borderwidth=2) + self.menu_frame.pack(side="left", fill="y") + + self.content_frame = tk.Frame(self.main_frame, relief="sunken", borderwidth=5, background="#ffffff") + self.content_frame.pack(side="left", expand=True, fill="both", padx=20, pady=20) + + # Crear múltiples frames dentro del área de contenido + self.frames = { + "frame1": tk.Frame(self.content_frame, background="#ffdddd"), + "frame2": tk.Frame(self.content_frame, background="#ddffdd"), + "frame3": tk.Frame(self.content_frame, background="#ddddff"), + } + + for frame in self.frames.values(): + frame.place(relwidth=1, relheight=1) # Superponer frames + + def crear_botones(self): + self.button_frame = ttk.Frame(self.root, padding=10) + self.button_frame.pack(side="top", fill="x") + + self.button1 = ttk.Button(self.button_frame, text="B1", style="TButton") + self.button2 = ttk.Button(self.button_frame, text="B2", style="TButton") + self.button3 = ttk.Button(self.button_frame, text="B3", style="TButton") + + self.button1.pack(side="left", expand=True, fill="both", padx=5, pady=5) + self.button2.pack(side="left", expand=True, fill="both", padx=5, pady=5) + self.button3.pack(side="left", expand=True, fill="both", padx=5, pady=5) + + def mostrar_frame(self, frame_name): + # Ocultar todos los frames + for frame in self.frames.values(): + frame.lower() + # Mostrar el frame seleccionado + self.frames[frame_name].lift() diff --git a/__pycache__/ControllerMain.cpython-313.pyc b/__pycache__/ControllerMain.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c94acb0e8009bba3288526228f812b86392e0b59 GIT binary patch literal 1609 zcmcIk&1(}u6rb57n{CoqKUyhKa4V&-DTFq)prz!Xo>H1aHt`f3x0_8^yVVfSChKc%k(FpYO0Cq@|aH69mQDGy9~f~Pu3EhVz|JU8H;W3)Vegsz#1 zm;}D4z$u>NHOtE4p-t zs%Nn&f8IQk4YGF*TUe#jjAybX&t=PZvkeYOlbrzXYO8cQ9x` zzpvVGNg|_8W8!I|NmU`YxzV-ecO{Y9!gdh3uIC5b;4C!kQjzp6r|qLR+hWdKYBqd} z`^|N0%XXXhEq^`mHkzQ?vQ4WQHHBmGRl|0R8&8F@>=@m(mQfZnLmg9O%y#X7vEs7h znTF$+0SwMzYWw3Ler%I>(;o`&3;U%?uT=SXd#_aQV-(Q3Y18X=4Y&1wvr^(&_&a_9 z#2|it5%-r+Tm}(Zu?`&l{lC5}oa4(Vx^dzQ$1G}TA$P;a&e1B;Ynwsfx${CcJ-2Ol zVnrzi3miL9OYkuy!x0c(^s$W|scIO#P~y^w@xK)`1!w(dAfS8)SFgWFzRDg<?MeU&;5B{Jt{PQ>OL`^-l;I2g>L_*@jrvo}#{;{Hzqha%j@82&$Tle!I}= zjEM|mkd{pc@hD?YHVr4Tj4{@>xgR*TYq=g{{00OfCK!W<5!fa(f`HqQMaySwcTn{~ zOUQ7Jqrjo%Mfh_I=m koG%X?E^`fZ_!RvK5XT8h=^;@M$+hpvES>#IK!n$R0t7T8+W-In literal 0 HcmV?d00001 diff --git a/__pycache__/VistaMain.cpython-313.pyc b/__pycache__/VistaMain.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..408d17db18c333c10d225894efee46aafe0e91d2 GIT binary patch literal 4363 zcmbtXU2Gf25#BrAkw=P>Y+1jQY!R|x`PxR&kL8p>P&bMlI8iOwI?0t`6^9dfq^_cP z>fT9_{N$%X0)i@aAy_aFSOyBj2KwMfJ^Im)Wa5;@)&&C8FMM;P76tm$nY|+=v2>iu zOK@&>W@mTrcIKPez54nHfi_LQ%=|e_$Um@CZj#UJ{S25*q7h9PBUFH=I7U7dsTe2i zq=#sM7}2B=(Hl(z89|jx*cn#^7I5A9q^I$y;CJ?hfY~H7d_pQ}0u5+lj8F-uqp~Ie z4QevbkQM~0XdxQTC~BC=*Dc32O1QhEzbKy*1p)Z)HNYC1WcpZ^i;+x`i3-2ZOyKCM zrU@hd4&$%0lB-OhtBG&43e~U*Xi`Gp>%gb4ZX>>c>+7nugdEb>|ByaIRC)YX=XEpZ z8aX4Lv~%%M+qHA16JL#gOpOJTDT6~lA6R*BXy8`pbZXc%(nD}|;%r6@F^Sr?%VgJb zvoJ1W+6$&jS6LXQNn4pEYO-jOng-QP$F;I{xtGRy9ait@X1(=Pkx7o3O;dC_2M;eE zXFpB8KQrZ+)R~z#m#y5)Mbnvg?Zp`oEn7)*h9CD8!^-t9t};c}t(@iRI&0wa{&F8r z#X(QIO`bQme;$6WL^s0g;f==i#(ew8Gv&N5C@Qgn65D$JnR2Eg=`1LnTdR2mp6Yi> zw5W6xl#XXgCk!~uqv^Lw*B&fGl4VcEjskz~dw&6DliWlZZxaVS)R*;C&TfiiD|+zJ za=`iH@G()#Zv;)$z;`rR3npalAGIuN_>?ASp?3vMfqys=h!gOP$T$m4jxM?24{$p2 zhtx8%rDL#i3C{@JVPN1rBboe9=yaMlRbo=w&bchKXrxkBF2f?TMshww?WJ6bMbb7k zJsxHY8cEk$Hu)qY=|n;mX&fe{oj`y;g?u;iGR2R_WX)X#CzBm~Q1odQSTGhJ3G_Jd z4u0@BZ30RgP}k&nz(Mb8#Bsj@a+|zpX}^2p&W%6aT$4VJ;891`BSodFpmc5Bc=($q zqj_y6Z_zwT9ACZBu-@>+YQF!Y{5u!(6Pf(AxwVF`6^pjOgtd?RF&y8UkGuBKmLUV2 zpaMiNG6;)RwTaqC2~Lm@<8O4f+H-pDqlGjjA;S(Tpa!FPMmW5MnmY(<5v}emb`aE} zTD{hgkYN4FTf_R%!)s&jHS0s#&>G=)48!0}L05Zb?YP#I5RYhk;w@~O(N=5e55U`3 zf*kgUu3gn8(EY1g8U9a@%O?oQ2~)xZJgb}53cofyqbuOVb%cj}`#6&Tkmn{5j?-2) z%Yx?0qLE9Lo`O9@YkB~GEa)ud=FMCQAqv7?{>)0bb3AHUkeXS`OtZRKo2E?4HB8Ey zX_pDBj}YZ85T6CZ5_*;w@d4V8{JTgn_Djt`9?5hV1u7CWU=je!3a6{Mmvjo6DsT(v zr&1{446$-pT-r4PQUnL$SzKOj9u+@mT1PRQ8t?e_9n>k#ae_0uN;lYKS(@)j> zOe#;ELd>mU^w8l(!!J*E-=DrWy`B2Xeqis+*A{i{((~x?jj{Ey?c)!PwXtua1G@pz`ja1k+~`|CF2IGD5RVAB zJmXfuT@9%0!Md>mXK=oL(}EmqG2AQK1F-Y|%oMK7Q~{17&J?N4gcS^LwPCU*0M~f{ zt~F?lejQQ^ylN${|Fy)DqpJOwHKBqzHcn$;2@r7-9&qEZ7n!g^@qWR?(LvgVN`NHS zTybfSCmjOKFdcx-B<%xA&mlPvL=E#=g#Ho*cqlA7%c~Q3tOXoYz6uC}@Hf)@chdH6X+-GTB|x~@e*wb{I-&po literal 0 HcmV?d00001 diff --git a/models/Scraper.py b/models/Scraper.py new file mode 100644 index 0000000..1d41b94 --- /dev/null +++ b/models/Scraper.py @@ -0,0 +1,63 @@ +import requests +from bs4 import BeautifulSoup +from urllib.parse import urljoin +from pymongo import MongoClient + + +class ScraperModel: + def __init__(self): + self.to_visit = [] + self.visited = set() + + # Conexión a MongoDB + self.client = MongoClient("mongodb://localhost:27017/") + self.db = self.client["scraping"] + self.collection = self.db["visited_links"] + + # Crear índice único para evitar duplicados + self.collection.create_index("url", unique=True) + + def add_url(self, url): + """Añade una URL a la lista de pendientes.""" + if url not in self.visited and url not in self.to_visit: + self.to_visit.append(url) + + def scrape_next_url(self): + """Scrapea la siguiente URL.""" + if not self.to_visit: + return None, [] + + current_url = self.to_visit.pop(0) + self.visited.add(current_url) + + try: + # Solicitar la URL + response = requests.get(current_url, timeout=10) + response.raise_for_status() + except requests.RequestException as e: + return current_url, f"Error al acceder a {current_url}: {e}" + + # Procesar los enlaces encontrados + soup = BeautifulSoup(response.text, 'html.parser') + found_links = [] + + for link in soup.find_all('a', href=True): + full_url = urljoin(current_url, link['href']) + if full_url not in self.visited and full_url not in self.to_visit: + self.to_visit.append(full_url) + found_links.append(full_url) + + # Guardar URL visitada en MongoDB + self.save_to_database(current_url) + return current_url, found_links + + def save_to_database(self, url): + """Guarda la URL visitada en la base de datos.""" + try: + self.collection.insert_one({"url": url}) + except Exception as e: + print(f"Error al guardar en la base de datos: {e}") + + def has_pending_urls(self): + """Verifica si hay URLs pendientes.""" + return bool(self.to_visit) diff --git a/models/Screen.py b/models/Screen.py new file mode 100644 index 0000000..aadcc35 --- /dev/null +++ b/models/Screen.py @@ -0,0 +1,6 @@ +class Modelo: + def __init__(self): + self.contenido = "Selecciona un botón para mostrar contenido" + + def obtener_contenido(self, boton): + return f"Contenido del Botón {boton}" \ No newline at end of file diff --git a/models/__pycache__/Screen.cpython-313.pyc b/models/__pycache__/Screen.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..485921f7e2a176ab447cd94f316d7c6caa0537ba GIT binary patch literal 749 zcmZWnF>ezw6t?ejA+4H(B2|P=7D7lTq-3aA5MlrX6Io8(PO>gnH#+5Fhi6|UHYUW< zF(Xpf&in)>wvNav6B}xTSb6X6QiQPN&+qv?zxRE%H~s!D!*Ra&H2;e0cXGC)(;Ax* z8f!LU_gTUYS;8L&O$69Hh{JrFPb+VojX-0~QU*L>5F{MJBsgTyNkYUZ=|FcL#a-Wh zV@_0Qe$csmdzflaixB7L4#FCn9#WFCx+Io1 zO>$65k5}(}Ps&0UPD(#)6pXhUMBMHmyl3C;z53WWA8gQJd3$GM{}s1~PA!fP*irDH zmUV!8FSeuw_7%??S(g}w9!7nHLXEamQV5`Ce&5VcrUH2*(T`eY|3xA^V221uasS~( zbuqshj<0%SAUe=Rn8vqAqRy5ICGJXz7f_XC?@9T#%E~q}l=8Fy>&ikaZKMSHO>i5* zA4q9k=89Zq&OtG&oU)iOpoF>)(FS_r8t5HtAK?SL4tVsM|LXE+(qvN7G{!GP$^RDc cy{8SeXK)vzbrn+fGvu8A4kA9eW(akiKV{{!x&QzG literal 0 HcmV?d00001 diff --git a/zprueba.py b/zprueba.py new file mode 100644 index 0000000..2bf70b2 --- /dev/null +++ b/zprueba.py @@ -0,0 +1,15 @@ +import tkinter as tk + +root = tk.Tk() +root.geometry("400x300") + +# Crear un frame +frame = tk.Frame(root, width=300, height=200, bg="lightblue", relief="sunken", borderwidth=2) +frame.pack(padx=10, pady=10) + +# Agregar widgets al frame +label = tk.Label(frame, text="Soy un label dentro del frame", bg="lightblue") +label.pack(pady=20) + +# Iniciar la ventana +root.mainloop()