Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/01/2011, 21:46
SamuraiBlanco
 
Fecha de Ingreso: marzo-2010
Ubicación: Mérida, Venezula
Mensajes: 73
Antigüedad: 13 años, 11 meses
Puntos: 0
Aporte (si lo logro terminar) con Error de atributo self.Bind de Wxpython

Buenas noches a todos. He estado practicando un poco con WxPython y smtplib. Estoy trantando de hacer una pequeña aplicación de escritorio para mandar correos electronicos desde cuentas gmail. El problema surge cuando trato de cargar la ventana del mensaje, obtengo el siguiente tracerback:

Código tracerback:
Ver original
  1. Traceback (most recent call last):
  2.   File "loginemail.py", line 36, in OnAceptar
  3.     vnt=SenderMessage(value, None)
  4.   File "/home/victor/concurso/wxtest/sendmessage.py", line 26, in __init__
  5.     self.Bind(wx.EVT_BUTTON, self.Salir)
  6. AttributeError: 'SenderMessage' object has no attribute 'Salir'

El detalle(como dijo cantinflas) es que el método Salir se encuentra declarado en esa misma clase como se puede observar a continuación.

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. import wx
  3. #from loginemail import CE
  4. class SenderMessage(wx.Frame):
  5.     def __init__(self, logon, parent=None):
  6.         import pdb; pdb.set_trace()
  7.         #pos=(x, y)
  8.         if logon==None:
  9.             dialog=wx.MessageDialog(self, u'Error Fatal la aplicacion sera cerrada', u'Informacion', wx.OK | wx.ICON_ERROR)
  10.             dialog.Destroy()
  11.             self.Destroy()
  12.         else:
  13.             self.emailLogon=logon
  14.             wx.Frame.__init__(self, parent, wx.NewId(), title='Send A message', size=(300,300), pos=(250,300))
  15.             wx.Panel(self, -1)
  16.             lBienvenido = wx.StaticText(self,-1,u'Bienvenido', pos=(90,-1))
  17.             lDe=wx.StaticText(self,-1, u'De', pos=(90, 30))
  18.             self.De=wx.TextCtrl(self, -1, '', pos = (120 , 30), size = (150,-1))
  19.             lPara = wx.StaticText(self,-1, u'Para', pos=(90, 80))
  20.             self.Para = wx.TextCtrl(self, -1, '', pos = (120 , 80), size = (150,-1))
  21.             lcorreo=wx.StaticText(self,-1, u'Correo', pos=(90, 110))
  22.             self.correo=wx.TextCtrl(self, -1, '', pos = (110 ,140), size = (150,130), style=wx.TE_PROCESS_ENTER|wx.TE_PROCESS_TAB|wx.TE_MULTILINE)
  23.             boton_enviar= wx.Button(self, -1, u'enviar', pos=(110,100))
  24.             boton_salir= wx.Button(self, -1, u'Salir', pos=(130, 100))
  25.             #self.Bind(wx.EVT_BUTTON, self.Enviar)
  26.             self.Bind(wx.EVT_BUTTON, self.Salir)
  27.             self.Layout()
  28.             #self.Show()
  29.         return None
  30.  
  31.         def Enviar(self, evt):
  32.             De=self.De.GetValue()
  33.             basicPara=self.Para.GetValue()
  34.             Para=basicPara.split()
  35.             texto=self.correo.GetValue()
  36.             self.emailLogon.SendMail(De, Para, texto)
  37.             dialog=wx.MessageDialog(self, u'Su mensaje ha sido enviado', u'Informacion', wx.OK | wx.ICON_INFORMATION)
  38.             return True
  39.        
  40.         def Salir(self, evt):
  41.             dialog=wx.MessageDialog(self, u'Gracias por usarme', u'Informacion', wx.OK | wx.ICON_INFORMATION)
  42.             dialog.ShowModal()
  43.             dialog.Destroy()
  44.             self.emailLogon.CloseServer()
  45.             self.vntReferente.Show()
  46.             self.Destroy()
  47.         return
  48. if __name__=='__main__':
  49.     app=wx.App(0)
  50.     ventana=SenderMessage(None, None)
  51.     ventana.Show()
  52.     app.MainLoop()

Por otro lado, la primera frame para ejecutar el Login en el correo electrónico se puede ver a continuación:

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. import wx
  3. from moduleemail import ConnectEmail
  4. from sendmessage import SenderMessage
  5. class Login(wx.Frame):
  6.     def __init__(self, parent):
  7.         wx.Frame.__init__(self, parent, wx.NewId(),title='Inicio Sesion', size=(300,200), pos=(250,250))
  8.         #self.ventana
  9.         #import pdb; pdb.set_trace()
  10.         #AlmacenCajasTexto=wx.BoxSizer(wx.VERTICAL)
  11.         self.lemail=wx.StaticText(self, -1, 'Email', pos=(50,10))
  12.         self.contrasena=wx.TextCtrl(self, -1, '', pos = (130 , 50), size = (150,-1),style=wx.TE_PASSWORD)
  13.         self.lpass=wx.StaticText(self, -1,'password', pos=(50, 50))
  14.         self.email=wx.TextCtrl(self, -1, '', pos = (130 ,00), size = (150,-1))
  15.         wx.InitAllImageHandlers()
  16.         boton_aceptar= wx.Button(self, -1, u'Aceptar', pos=(50,100))
  17.         boton_salir= wx.Button(self, -1, u'Salir', pos=(150, 100))
  18.         self.Bind(wx.EVT_BUTTON, self.OnAceptar, boton_aceptar)
  19.         self.Bind(wx.EVT_BUTTON, self.OnSalir, boton_salir)
  20.         #self.Show()
  21.        
  22.         self.Layout()
  23.         return
  24.    
  25.     def OnAceptar(self, evt):
  26.         email=self.email.GetValue()
  27.         contrasena=self.contrasena.GetValue()
  28.         self.CE=ConnectEmail()
  29.         MSG=self.CE.SingEmail(email, contrasena)
  30.         if MSG=='Sesion Iniciada':
  31.             dialog=wx.MessageDialog(self, MSG, u'Informacion', wx.OK | wx.ICON_INFORMATION)
  32.             self.Hide()
  33.             dialog.ShowModal()
  34.             value=self.CE
  35.             #import pdb; pdb.set_trace()
  36.             vnt=SenderMessage(value, None)
  37.             vnt.vntReferente=self
  38.             vnt.vntReferente.Hide()
  39.         elif MSG=='Error de Conexion: nombre de usuario y password no aceptado':
  40.             dialog=wx.MessageDialog(self, MSG, u'Informacion', wx.OK | wx.ICON_ERROR)
  41.             dialog.ShowModal()
  42.             dialog.Destroy()
  43.         self.Close()
  44.         contrasena=''
  45.         email=''
  46.        
  47.         return
  48.  
  49.     def OnSalir(self, evt):
  50.         self.Close()
  51.         self.Destroy()
  52.         return
  53.    
  54. #if __name__=='__main__':
  55. app=wx.App(False)
  56. aplicacion=Login(None)
  57. aplicacion.Show()
  58. app.MainLoop()

Este por su parte se vale de otro modulo para manejar smtplib que es el que sigue:

Código Python:
Ver original
  1. #!/usr/bin/env python
  2.  
  3. import smtplib
  4. class ConnectEmail:
  5.     def __init__(self):
  6.         self.email=''
  7.         self.password=''
  8.         self.mensaje=''
  9.         self.AdressServer='smtp.gmail.com:587'
  10.         self.server=''
  11.         self.response=''
  12.         return
  13.  
  14.     def SingEmail(self, email, password):
  15.     self.server=smtplib.SMTP(self.AdressServer)
  16.     self.server.starttls()
  17.     self.email=email
  18.         #import pdb; pdb.set_trace()
  19.     try:
  20.         self.server.login(email, password)
  21.    
  22.     except smtplib.SMTPAuthenticationError:
  23.         print "Error de conexion: nombre de usuario y password no aceptado"
  24.         self.CloseServer()
  25.         return "Error de Conexion: nombre de usuario y password no aceptado"
  26.         return 'Sesion Iniciada'
  27.  
  28.     def SendMail(self, De, Para, Texto):
  29.         import pdb;pdb.set_trace()
  30.     texto="""
  31.      %s""" % Texto
  32.         self.server.sendmail(De,Para,texto)
  33.         return True
  34.  
  35.     def CloseServer(self):
  36.         self.server.quit()
  37.         return True
  38.    
  39.     def returnUserEmail(self):
  40.     useremail=self.email
  41.     return useremail

Bueno, espero que me puedan dar alguna ayuda con este bendito programita y agradezco su ayuda.