From 74be3ca32fef1a1ffd8f66067caee329ef1b1710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moran?= Date: Tue, 4 Feb 2025 19:56:55 +0100 Subject: [PATCH] Primera version de correo --- app/__pycache__/chat.cpython-313.pyc | Bin 2251 -> 3618 bytes app/__pycache__/emailClient.cpython-313.pyc | Bin 0 -> 4187 bytes app/__pycache__/emailTab.cpython-313.pyc | Bin 0 -> 4760 bytes app/__pycache__/panel_derecho.cpython-313.pyc | Bin 7624 -> 9189 bytes .../panel_izquierdo.cpython-313.pyc | Bin 7079 -> 6995 bytes app/emailClient.py | 59 +++++++++++++++ app/emailTab.py | 68 ++++++++++++++++++ app/panel_derecho.py | 29 ++++++-- app/panel_izquierdo.py | 4 +- main.py | 7 +- 10 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 app/__pycache__/emailClient.cpython-313.pyc create mode 100644 app/__pycache__/emailTab.cpython-313.pyc create mode 100644 app/emailClient.py create mode 100644 app/emailTab.py diff --git a/app/__pycache__/chat.cpython-313.pyc b/app/__pycache__/chat.cpython-313.pyc index 996199cfef292c9829c816f8ecdd550d2bc3f595..9414f7544dfc1ea203c039d9e0014a80a32edd6f 100644 GIT binary patch delta 1645 zcmah}Urbw77(eI!=^tqCD3tcLmU8KauFJe-AmI4ZND<~#P`UI8^Yqc2-f_}m#Oz`H-(GQF5qsXw-Lb#B8-9wtJoCAk1k=tDXbq6Ug3aR z6dtHmu@GCz8n#!s(K$8uD|d7G9!{HS-0z%N$mG&*l59dVvWEFJj$+>2#^X3=b~1lG z8%I+uH1EGxZ;h2uitj)(Zu2C&h8xY_+0kZ~W+WC8b1Jzoujz(*Ni$5Dn-U!0VO#^U zgmyTa`8hXnY~9gQb~J4`LM2D&f#Za^%|(2%#+ZN#LPM;dEr_kLZnn_P!#=^7O^kbG zfbYThv8h{99uY!?Swh2BthG$UXZ~inX9|qxGy(ZL08bpffE5g&*mOLDL0DZ1(_7n1 zXofK}Oh5>sI96DNJIm-yoH1|k?);NQhAoTFj~x^y)$5WpJx5eMrx{XGGm@I5Wh6r* zSJKHWkrVY?^v}abQQW%*X`}cynr5e{{Kz_4Q@7(8~W4yth1 z#^*xSIz5|Cs4y=+YF51?aBw6^(h{L?SF8u8Ci%*9^xn!(T`qYjlTD}@BP!P{Pk@`T z4CK)gDmQ!X$amx&#_95xgQ1OJS1H)F5$r7md+#Ri2M2GQ+x7;_k-qP*etUH_bw4s* z6i=7Mz=jwpiIEMluO#*r`(IlZU*F1$ZAGcO*mJJf{Yo)-{(<=FFCYoNv@VX6!}1s0 zS3+5A+i68DUYgL9AMJaP*s+ILmw(IcD+c;k@m-_nA6$12l{-(}c=^^Oi2vNNg8s1) zgwx&{3B-Kp$1}}93%-U?hAkX#jSaJfVIKC2dFi~KPNY>mnU!i7z@yA$y zp9!Q1T+HvR5o|X%t%HqzUzxhpjA$9F{=KaL-|TX}EQ zpHM3}e>3%?XQ&Fui*!fhAIy(!Xg-@<$Y@b=7G(6%Gg^V{uo&Y_cK`#LkItz1l(4brni9oW46clP@X8{`% zYahTy9{{klra7L#j-bZM#5p$EZ)SG>*_q7q=Et(}rRzb0r#*RcdbDqxAM9fENGgPb zMYv=Emo3$jVx$3_T5^nVW>KVKF|ImFO7m#3UhRCc{>u=`q7D1v4URz(b11=?IF$Yr zhi#E^SXAV92#Po@iY`4hbZq0^AnwSFs$xP<1gvL{wcFV0cY`!i`bvV$|poxs0Q=*vUanaQ?w+vl3 zjJPM?5@S1aBfz$QA{r|JU-D%Xf&cjuFVLxTyIQ+!Ig4kW^aTr*Ke(qIHQTl8E8FBL b3<0m}PcxGNU`q5US^8BrZ~=4Tb5ZyYfH+g2 diff --git a/app/__pycache__/emailClient.cpython-313.pyc b/app/__pycache__/emailClient.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fba0fac82bd0c2b8af56af372f39afa0e70f060 GIT binary patch literal 4187 zcmbtXU2GFq7QW;8vzPQpHRoIfg1!O@v_%3zEmBs37xHoE5^NT@%fv zwCr$JQ+4YB?2x2gJ7`XT9}B;=UJ$TFCP}iOm5c0=S(%f0S&+pD4?XKMXGz!_FEsS+ z?~nAou`klszdO>md*H!ln5PwClr|1KeefAJ{|4s6yv@n6#PNcFa+h3aDA&ouu`yX5 zI~KROvDnb@?*){*tBcQqdSnLual^nvbdn^KcqyMN2|gjZqa<>o#_e`p z*O>&LWMt2F=tyv&v5p2uC3C1HnaMhLPPIPK;OYs857+)6-Y6&%`qEg|H%jmYR+z+7 zd9JwL3}OU90Z&6^jSyL=+67R6KX*Mm_D<4Ec2tIDVEq}7L^@zT_Pxb+kQt_voM?7! zi6qrZi0;{7T}*oF$$+Q2MhC2*dxku-m3oGmsaS$YrFeigH%g71?MWE6DCbY&orl=U zrZm0q%CJGHYCx=fprtZ~l*VS-N?}B)kwSZvQiDpVY!+M=1W=CayJ zXBAoxOHn*%o6j1vnojX@*h0#(Qt49^Ps;Y1s-D5bdfEv43PG6ulWN1zSHqdhY0j!ot3l;GVl}+kf-= z+2K-G@7duC!nyI1gbH_Vth8+>D86%X00|ub+tUl;V$1E0{VTx(Xd-qlHs7<5y)yjg z*wxtA$5w(9cY~Xk+pzmdBWWIGRzuM{q3F}cO(gir8ezbzKxnyjU~y=1V7YnkYG7Y6 zuigA9Um)|FFbf_tp=$v)9{s z(7$4A0Zw~XwZ39)pLL3=sSLg|A>pVtZ$hsX_By9cF#u^8MK_9VDDbk=9uQ#2nPYmP z@iV7LQu&qCJ#+l_=9j)13^Eff{__lZ;;HrRe?&k$-a?w%R~tKTHFhpE7aMnfB9y%K zpVj`d_S1SAgu&^JD1|!S#kCm_F608-G6=Lub`Mv9TJDF?FUdJj%P0B&7HaVT9H{*x zVE7^KKZ08S3!&Eke?hG`;j2OuK;Syqf`64FZvYw?@d9YYyvMbYhyBboB|S2SU_ZGI zx~?@KfQqWKiJBKdE~Xr=HHpBO7l1D&B~?I7vMvwghe8rjk zi~x`7<%TM$#8QOR05$xNH1euz9B4!WKgE~&8AyuHd+5-LI3zl>0`&%3X^d062sW?j zCymp#kc`XGXq;j~QegWcyKNRwz91$b@l;JIk3m~u4O7w$DXU)pL&h*8{(^VMrWbvO85Tw5_ueaFupaqpo!z zrGPDJxfGI;?ZcdMk0Q$xRcfMJ(4+wQB$6Q1DVjb7CjhaRzv8HPn48)ID!q{P@d{7p=>MONFH!#l7Pzp^4?=iD#(| zTjS@(=f#!aj#A&?<@QVMR}xG6ZudY0uP6(}7%gt916TGeF<194^<6!1yKD4Uj9*H zIq~*#|4&z1-zl|j`JMj@|NOv$cX7v^)`Q>qh!lRZi8RN6ODFDxCY}P3l({s{lmhLm zfv#epYkqLKcXa9frS#3F<(`SvK&%*uIkXyQTwWdNC6|UfN7~sNOS0Ir`lHS4jW?R3jqG0g z@8?t5N>78L%xKiKvYM{K6<25ztV;(_`~-v@QXu0?Sz20wl#psC^AJ3W@)dD7+PTOS z_v#4D+e}Q?enB32e7yfrbAWI8`_>TOQXY*1!#>)MY&Q%*XA z8=mIe?`tPHrLW^uXVG_1!(^cxQQkMpn><7@4M22qKJg%(Vwn4+{u}(S{g!O~mPEcG PfhXJm)AERba7_FQ_jR0T literal 0 HcmV?d00001 diff --git a/app/__pycache__/emailTab.cpython-313.pyc b/app/__pycache__/emailTab.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a44dad8001ad247772a4b867289bf7f4c92b2f6 GIT binary patch literal 4760 zcmdT|O;8-i6`uWXmRTVXLM!pNLRhd)jD-U-5S3h5U{O+_%nnpYw8?nb9mAMq26|>K z;G|qqk}E06u2RXR9JKO9P~|F<9?jxT!mW zJkL$f4KMXZgs{*iNZxaTVfaxmp~p0w+d>6UjAATCWTaycdGzeh@qfEPn$65>dlXZS;euFu2}VW#xDMWi%HI}jiU>18)HBBX*9=NkW6j09mbzp`0~D1qQAHoh3GPIS=$P+4s?4k4 zWM!Iplw^_-Q?=3ya$1YJnb%ZPA2OmFmO5=1b0+#H5@GX+f%v4UQZqhpP(_aq8Hw~f zgvE@%B@Ydb#wC@0tR*zVjHr5qs>%5K%hs%+$4ApCOM9Oh3Dq>r_iEm(UGF#K?9Qo% zNBy7me?GN!>f&ARpU5^jd0)IIKA3nk_32b*fLlQNVF~_^2&*t7kCYyG6$quERNe1}^-^3>fKNP#4SN+V`04n> ziugjW0$)i4i&+8)PaG3rNc!mrPgF!$^NJA`GaC?|JSM`LSAg(jMTE70u~(-$^(S;hyumGg7$Ub70;7 z7|ds+vw6(LlL%}$S8l_R`p<#iL)`C;hjzaogSrVcHkE6vh`M%Z$-!Wf_!M~WLgbE&(ywMKo+LygOEQM;uz%FWC2@INP z-GUw-K`Ufb)lKCibzqkt;BH;r?F2rY&Hh-SP`p23=BMzphn_^|b z0tsV&UeS}gh$`wSF%WIry#j>d<`ebpzhXfLsJWo%`#4r=VroL0)(RTTT|Tddxve?o z`;{`SrYLS*%sWH1B=Zde;$>D1RRLX=`DxBhIGqK>G;bR;$?BYbvcv~aq3{U`_W|=x zK=HyvEMa6QFwhaq|8Cl{44s8k4p>g`N+&6omBI>zSTnrkjv3&xokrwBa-l;SQ_ zQcx7C9!zO-2_kVv_$LY8C!df9^^d}zhO?2&HhDWouGr+t^V-es?BrBd{vbOun?;tk z)7bo^?{Qyd=-J5Ak*&rzunq}Bjgcc^n}l|H$|J#)e)Z{|pk zO?ozJpLcIc*x&zU zS?mq|$1hY>?^~a#vB{+z>9tAk#`))in~ChyZ?YdKS>#Obw6#C${GxNU=c~T8zOA+% zl-|mvx7wsNN7`-DzFNE9z0v)=JBz*HgSJ=MgOUw3>Cucz&%!5^0Ic&6%;s%`P){gHbk+qIGH`f#rPqFsOS-vMt` z@OvUu*W7D=(Ea&%CU&>o4tBzn=GGEbu?=cBy<15Yx(V_F!HkwGYval~?fTB6l>H;v zNpTxIP>H84tO<){;VmRW^10#>9Opn@?3-maH8ON;R zN~}6=Rph!=tS(|loN0wCX6*F7t%X)WTW`Le=65Og*ovpS>r%9uqRkX<8uTq7%rm1} z^cUFeL4uR%+eo^AFwgMV5c8Q9)fOmjvZWgj%3uw}o6Lc2>@tr11CTpH$s*~nNe5(W zPHeKprkohD#mJV}#yPFF*qReB*y4pP@iorDc24ZD#f~j8$~n!p*qjs3+v52x@xmca z=Cv>DzG_%&*b*=0#LKpLc}whjS?#Y1mZu@Qg{R@)pz;5ahQ0Yk!9(d9i~5}?{t^K2 zDAISZ#iKZYt;3b|@^5Nn`9qDGR!Y-V-H>I9We-34 zoK)rjPs_4tDNxkNiUk=vowig{me&MslXF<&6^tUmuXzT@AB7iguP^*U?C?cj#9RSi z@MWFP=iuNYqka~!<}}?>DPI%L-wiczx$olTfb&ld|6hWSr#DasZhl-PBUc9?g<#K%|)PF0S`Bv!o-h0&*d?5hgGye-0Pf;fT literal 0 HcmV?d00001 diff --git a/app/__pycache__/panel_derecho.cpython-313.pyc b/app/__pycache__/panel_derecho.cpython-313.pyc index 6729e64e9d80cac8b991a8300e90de8943b1824e..86e2c7166576e776cee2f23285892ae7199868dc 100644 GIT binary patch delta 2065 zcmah~O>7fK6rNdo?Tzgi$4>kgC*6{U$ON1g0{IoFP#_4BrrB6+RT_6$Z=9u@wKcm| zNDw$uOBG666b96WLrYbOg49Eisl=^UB&s$pKaRE>xby(M$k&fINbmV5Q(e-b`iOJ3SwV?Zqhkfwd>WKpSoe$M7$XB)nH_bm|O@6=y28 zL*A@cG(}QGloBN)FRIFfC@EPjH7aYmcu3aqoa;D5c*xyW*_&4lr5|M_ShH;}hPtz7jyy2Z- zqJt!OlQrbSMiwQBtlJ3iJdfVRnW{#(1Akg|!$t3ct}k);4{r4 zKw<>Ka30PL;KcF=E2QC{iGcXdN}Pnf75t zRZ%@%sUy%A=TI-1P4AeZ4QEr*h@z&EteMUcuA4eET0nz9UiCspUjX}-P4)6r~Fv@n7}r87Sw}5FaRl= z;UF#rYj6_2;C7HrYYcFB!4WKMS;>MBa|bCR)0bJ^zPp`JEKg+gDgo1%&!t5}PAO?s zHbnh>-LxCZsBE&jD$BV`(5k&o&zfAWFl%LFcK)N9&%OwSC!d5wx0;niRo|AdjNc}w z>6-{VoCI_J;GD0z>`Rnwpu!kIvY1x1jOiFGSTae2=oxXwN&_9Ej_FJI-ZEX0KxDJ| ze^Ple6T*3*HxMA9|7o{Z@DDto!e8dXzjER8?8S76+g#>4N?Zqbi|ew2#oq;w;Gg{) z+R!91>m%Lt0h!T<1k5TV=TJ7CmlTv5&FhLJqT_V)C;{uv>GQTP&;liVITXUD1AYdL z6)yxfG9lWM%MT&VXQlnn6uw{605e5za2NDWl8wjyuowzdJ$w4`P&3St)7Qf>d?$1j zp2TOvO&dNTrY4&c^SX>E{m>~2PliRmG1ZFVQ=up{ur0F5PK#sZdnMBHwEKlf@L$}A zqX{@}B{vieSRq7;C!;JRaZJ~?Hd}Gnbt9WYpHYv`k7WkW*RF*}aUj-1jyVvkg=_HP z*w(@jHQPtQ;yf)ldY!@)g?)8?v5CT>@4$tsX$M z*DRp_4!xVeM_`d@V-t%Ay4W7L7%m4rY delta 815 zcmaJ;&ubGw6rQ))-6T!ZHkx8KY1(vCDY0pl(jNz<3RMg=)V8Syv9*L`Nf(+Q%xP|bL4NB=e*d<_ezc7r50jm6 zOWNz&=?kYt*RCj~z1C#=Z6TcDTDD|rt7e(b^Vo24h{a-bfxQo$gbVCv;2nF`>18uL z8v7JV&Ta{|Y-VXeGi^Da)r#fPbV9Vf<}%f?dA(Gy<#{Kx15~Tfa=x0==~A(3=((&d z8JuZu0Yy~

JiLmD4cI)|7;>PpqfPpl|}yhi~kazb5?uTB^cKE2^Xd- zm??6w{grIh$o|%%WlU5!9O-OC2jDu}j-CR_8qt?vvWMOM$trRs$ogmuVGbLlDU3*i%@VXoDQI@FGx503A>g%yhuw(B7o6r#@V&#On;0DxwLRyGeEcig n1ii}>IBi4a@WllHbrNil?gmlnq@zy!2XY=@4w}SSoEpCX>!QzC diff --git a/app/__pycache__/panel_izquierdo.cpython-313.pyc b/app/__pycache__/panel_izquierdo.cpython-313.pyc index 9fb6d70bb778ffb3bc49af820bdf10de641564ad..b9542a7278e6c6d573c6cbc7fee0db2f51e0e9c3 100644 GIT binary patch delta 426 zcmY+;%_~Gv6aaANn&Fx8&|Xg3l&_*#xJNe5;&;!z_uO;Ob?RZnd^62Zm5%xB<<94g83njdoiNI9 zEEvW|7{N+)8Dcou*rMhG?O@hZF~vgFTpVv%50;sMuMlH%ZD=(`)kmeA({D#tg!IC_G$St|cg}QI# CQFE05 delta 449 zcmY+8O-lk%6ox&cjaR3!veIe%s5X&A9}px_NEDU0Xd#7B`4x?{&e(ITOraM~6^ zLF>4Gpk3RfC>f|tt9AqR1G-n*bQTZqeeOB%KF{1mx^dlAp7PX=_VQINd!ps52by7ui?wRCteb9KJE>$3^Sj!iDgEtmg|Dth z$lP4J!P6q0ZzRwpffo|`5otr3_;X5=C@(~{MEcaJbifXN^^A)t*3a0)pmzxpH0QM- znBeA^p&~HkhKxxrmKn?tW)&YcyiR)AC)r^e8~)frntx|FvK%=E(@`oHbz_yk^Be_^ zeTE1z4tOqdlsHZ?tSI6Uj|n=jq##mZdCjOXMg*hX=A7k!ZQ@LrDr=+S$G|MCqN1)y SNhaGpjW`xn9n#oR&wc?*DRoQ$ diff --git a/app/emailClient.py b/app/emailClient.py new file mode 100644 index 0000000..4b8a44c --- /dev/null +++ b/app/emailClient.py @@ -0,0 +1,59 @@ +# emailClient.py +import smtplib +import imaplib +import email +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +import threading + +class EmailClient: + def __init__(self): + self.server_ip = "192.168.120.103" + self.ports = { + "SMTP": 25, + "SMTP-S": 465, + "SMTP-SUBMISSION": 587, + "IMAP": 143, + "IMAP-S": 993 + } + + def enviar_correo(self, email_user, password, destinatario, asunto, mensaje): + def enviar(): + try: + with smtplib.SMTP(self.server_ip, self.ports["SMTP"]) as smtp: + smtp.login(email_user, password) + msg = MIMEMultipart() + msg["From"] = email_user + msg["To"] = destinatario + msg["Subject"] = asunto + msg.attach(MIMEText(mensaje, "plain")) + smtp.sendmail(email_user, destinatario, msg.as_string()) + print("Correo enviado correctamente.") + except Exception as e: + print(f"Error al enviar el correo: {e}") + + thread = threading.Thread(target=enviar) + thread.start() + + def recibir_correos(self, email_user, password, text_widget): + def recibir(): + try: + with imaplib.IMAP4_SSL(self.server_ip, self.ports["IMAP-S"]) as mail: + mail.login(email_user, password) + mail.select("inbox") + status, mensajes_no_leidos = mail.search(None, 'UNSEEN') + no_leidos = mensajes_no_leidos[0].split() + + text_widget.delete("1.0", "end") + text_widget.insert("end", f"Tienes {len(no_leidos)} correos no leídos.\n") + + for num in no_leidos: + status, data = mail.fetch(num, '(RFC822)') + mensaje = email.message_from_bytes(data[0][1]) + text_widget.insert("end", f"[NO LEÍDO] {mensaje['Subject']}\n") + mail.store(num, '+FLAGS', '\\Seen') + except Exception as e: + text_widget.insert("end", f"Error al recibir correos: {e}\n") + + thread = threading.Thread(target=recibir) + thread.start() diff --git a/app/emailTab.py b/app/emailTab.py new file mode 100644 index 0000000..875fea7 --- /dev/null +++ b/app/emailTab.py @@ -0,0 +1,68 @@ +# emailTab.py +import tkinter as tk +from tkinter import ttk +from app.emailClient import EmailClient + +class EmailTab: + def __init__(self, notebook): + self.email_client = EmailClient() + self.tab = ttk.Frame(notebook) + notebook.add(self.tab, text="Correo") + self.setup_ui() + + def setup_ui(self): + # Campos de entrada para credenciales + tk.Label(self.tab, text="Correo electrónico:").grid(row=0, column=0, sticky="e", padx=5, pady=5) + self.entry_email = tk.Entry(self.tab) + self.entry_email.grid(row=0, column=1, padx=5, pady=5) + + tk.Label(self.tab, text="Contraseña:").grid(row=1, column=0, sticky="e", padx=5, pady=5) + self.entry_password = tk.Entry(self.tab, show="*") + self.entry_password.grid(row=1, column=1, padx=5, pady=5) + + # Campos de entrada para enviar correo + tk.Label(self.tab, text="Destinatario:").grid(row=2, column=0, sticky="e", padx=5, pady=5) + self.entry_destinatario = tk.Entry(self.tab) + self.entry_destinatario.grid(row=2, column=1, padx=5, pady=5) + + tk.Label(self.tab, text="Asunto:").grid(row=3, column=0, sticky="e", padx=5, pady=5) + self.entry_asunto = tk.Entry(self.tab) + self.entry_asunto.grid(row=3, column=1, padx=5, pady=5) + + tk.Label(self.tab, text="Mensaje:").grid(row=4, column=0, sticky="ne", padx=5, pady=5) + self.text_mensaje = tk.Text(self.tab, height=5, width=40) + self.text_mensaje.grid(row=4, column=1, padx=5, pady=5) + + # Botón para enviar correo + tk.Button( + self.tab, + text="Enviar Correo", + command=self.enviar_correo + ).grid(row=5, column=1, pady=10) + + # Área de texto para mostrar correos recibidos + self.text_correos = tk.Text(self.tab, height=10, width=60) + self.text_correos.grid(row=6, column=0, columnspan=2, padx=5, pady=5) + + # Botón para recibir correos + tk.Button( + self.tab, + text="Recibir Correos", + command=self.recibir_correos + ).grid(row=7, column=1, pady=10) + + def enviar_correo(self): + self.email_client.enviar_correo( + self.entry_email.get(), + self.entry_password.get(), + self.entry_destinatario.get(), + self.entry_asunto.get(), + self.text_mensaje.get("1.0", tk.END).strip() + ) + + def recibir_correos(self): + self.email_client.recibir_correos( + self.entry_email.get(), + self.entry_password.get(), + self.text_correos + ) diff --git a/app/panel_derecho.py b/app/panel_derecho.py index 03f13ec..92a076b 100644 --- a/app/panel_derecho.py +++ b/app/panel_derecho.py @@ -2,9 +2,9 @@ import tkinter as tk from tkinter import messagebox from app.chat import Chat import threading +import time import pygame # Para reproducir música - class PanelDerecho: def __init__(self, frame): # Inicializar el cliente de chat @@ -33,7 +33,7 @@ class PanelDerecho: self.entrada_mensaje = tk.Text(self.frame, height=5, bg="lightyellow", wrap="word") self.entrada_mensaje.grid(row=2, column=0, sticky="ew", padx=5, pady=5) - # Botón de enviar + # Botón de enviar boton_enviar = tk.Button(self.frame, text="Enviar", bg="lightgreen", command=self.enviar_mensaje) boton_enviar.grid(row=3, column=0, pady=5, padx=5, sticky="ew") @@ -58,9 +58,11 @@ class PanelDerecho: boton_restart = tk.Button(musica_frame, text="Restart", bg="blue", fg="white", command=self.reiniciar_musica_thread) boton_restart.pack(side="left", padx=5) - self.frame.rowconfigure(4, weight=1) + self.frame.rowconfigure(4, weight=1) + + # Iniciar actualización de mensajes + self.iniciar_actualizacion_mensajes() - # Métodos del chat def enviar_mensaje(self): """Enviar un mensaje al servidor.""" texto = self.entrada_mensaje.get("1.0", tk.END).strip() @@ -73,6 +75,25 @@ class PanelDerecho: else: messagebox.showwarning("Aviso", "El mensaje está vacío.") + def actualizar_lista_mensajes(self): + """Muestra los mensajes en la interfaz.""" + for widget in self.mensajes_frame.winfo_children(): + widget.destroy() + + for mensaje in self.chat_client.mensajes_recibidos: + mensaje_label = tk.Label(self.mensajes_frame, text=mensaje, anchor="w", justify="left", bg="white", wraplength=180) + mensaje_label.pack(fill="x", padx=5, pady=2) + + def iniciar_actualizacion_mensajes(self): + """Inicia un ciclo para actualizar los mensajes en la interfaz.""" + def ciclo(): + while True: + self.actualizar_lista_mensajes() + self.frame.update_idletasks() + time.sleep(0.5) + + threading.Thread(target=ciclo, daemon=True).start() + # Métodos para control de música def reproducir_musica_thread(self): diff --git a/app/panel_izquierdo.py b/app/panel_izquierdo.py index dc072e6..4f18d40 100644 --- a/app/panel_izquierdo.py +++ b/app/panel_izquierdo.py @@ -24,7 +24,7 @@ class PanelIzquierdo: self.weather_label = tk.Label(clima_frame, text="Cargando clima...", bg="white", font=("Helvetica", 10), fg="black") self.weather_label.pack(pady=5) - self.update_weather() + #self.update_weather() Comentado para que no gaste limite de requests en la api # Sección: Scrapping scraping_frame = tk.Frame(self.frame, bg="white", bd=2, relief="sunken") @@ -53,7 +53,7 @@ class PanelIzquierdo: noticias_frame, text="Cargando noticias...", bg="white", font=("Helvetica", 10), fg="black", wraplength=180, justify="left" ) self.news_label.pack(pady=5) - self.update_news() + #self.update_news() Comentado para que no gaste limite de requests en la api # Configuración para que las filas crezcan dinámicamente self.frame.rowconfigure(2, weight=1) diff --git a/main.py b/main.py index 439b739..7d1c09b 100644 --- a/main.py +++ b/main.py @@ -18,6 +18,7 @@ import matplotlib.pyplot as plt import random from app import graphics from app import todo_list +from app.emailTab import EmailTab def update_time(status_bar): while True: @@ -114,7 +115,7 @@ notebook = ttk.Notebook(frame_superior, style="CustomNotebook.TNotebook") notebook.pack(fill="both", expand=True) # Crear cinco solapas en el frame superior -for i in range(1, 6): +for i in range(1, 7): tab = ttk.Frame(notebook) if i == 1: notebook.add(tab, text="Scrapping", padding=4) @@ -134,13 +135,15 @@ for i in range(1, 6): elif i == 5: notebook.add(tab, text='To Do List', padding=4) todo_list.crear_solapa_todo(tab) + elif i == 6: + EmailTab(notebook) else: notebook.add(tab, text=f"Solapa {i}", padding=4) # Añadir un Label en cada solapa para diferenciarla label = ttk.Label(tab, text=f"Contenido de la Solapa {i}") label.pack(pady=10) - + # Notebook para las pestañas en el frame inferior notebook_inferior = ttk.Notebook(frame_inferior, style="CustomNotebook.TNotebook") notebook_inferior.pack(fill="both", expand=True)