예제 #1
0
파일: smsender.py 프로젝트: mattgaviota/SMS
class Main_app:

    def __init__(self, master):

        self.main_frame = tk.Frame(master, bg='#c8c8c8')
        self.main_frame.grid(ipadx=2, ipady=2, padx=2, pady=2)
        self.remitente = tk.StringVar()
        self.number = tk.StringVar()
        self.captcha = tk.StringVar()
        self.browser = get_browser()
        self.personal = Personal()

        self.show_captcha()

        '''Etiqueta del número'''
        self.cod_label = tk.Label(self.main_frame, text="Número de destino",
            bg='#c8c8c8')
        self.cod_label.grid(row=1, column=1, sticky=tk.W)

        '''Caja de entrada del número'''
        self.ent_number = tk.Entry(self.main_frame, width=10,
            textvariable=self.number, bd=2, relief=tk.GROOVE)
        self.ent_number.grid(row=1, column=2, sticky=tk.W + tk.E)
        self.ent_number.focus_set()

        '''Etiquetas de ejemplo de número'''
        self.ejemplo_label = tk.Label(self.main_frame,
            text="código de area sin el 0\n y el número sin el 15",
            bg='#c8c8c8')
        self.ejemplo_label.grid(row=2, column=1, sticky=tk.N)

        self.ejemplo_label = tk.Label(self.main_frame,
            text="por ejemplo\n 3874567890", bg='#c8c8c8')
        self.ejemplo_label.grid(row=2, column=2, sticky=tk.N)

        '''Etiqueta del remitente'''
        self.remitente_label = tk.Label(self.main_frame, text="Tu Nombre",
            bg='#c8c8c8')
        self.remitente_label.grid(row=1, column=3, sticky=tk.E)

        '''Caja de entrada para el remitente'''
        self.ent_remitente = tk.Entry(self.main_frame, width=10,
            textvariable=self.remitente, bd=2, relief=tk.GROOVE)
        self.ent_remitente.grid(row=1, column=4, sticky=tk.W + tk.E)

        '''Etiqueta del mensaje'''
        self.msje_label = tk.Label(self.main_frame, text="Mensaje",
            bg='#c8c8c8')
        self.msje_label.grid(row=2, column=3, sticky=tk.W)

        '''Entrada de texto para el mensaje'''
        self.ent_msje = tk.Text(self.main_frame, width=25, height=4,
            wrap="word", bd=2, relief=tk.GROOVE)
        self.ent_msje.grid(row=2, column=4)
        self.ent_msje.bind("<KP_Enter>", self.keypress_return)

        '''Etiqueta del captcha'''
        self.cap_label = tk.Label(self.main_frame,
            text="Palabra de verificación", bg='#c8c8c8')
        self.cap_label.grid(row=3, column=1, sticky=tk.E)

        '''Caja de entrada para el captcha'''
        self.ent_captcha = tk.Entry(self.main_frame, width=4,
            textvariable=self.captcha, bd=2, relief=tk.GROOVE)
        self.ent_captcha.grid(row=3, column=3, sticky=tk.W)
        self.ent_captcha.bind("<Return>", self.keypress_return)
        self.ent_captcha.bind("<KP_Enter>", self.keypress_return)

        '''Boton para enviar'''
        self.hi_there = tk.Button(self.main_frame, text="Enviar",
            command=self.send, relief=tk.FLAT, bg='#c8c8c8', bd=0)
        self.hi_there.grid(row=3, column=4)

    def keypress_return(self, event):
        self.send()

    def comprobar_cadena(self, cadena, longitud):
        for caracter in cadena:
            if caracter in '0123456789':
                pass
            else:
                return False

        if len(cadena) == longitud:
            return True
        else:
            return False

    def send(self):
        mensaje = self.ent_msje.get("1.0", tk.END)
        number = self.number.get()
        if not self.comprobar_cadena(number, 10):
            message = 'Número incorrecto, debe tener 10 números'
            showerror(title='Error', message=message)
            return 0
        remitente = self.remitente.get()
        captcha = self.captcha.get()
        if not self.comprobar_cadena(captcha, 4):
            message = 'Captcha incorrecto, debe tener 4 números'
            showerror(title='Error', message=message)
            return 0

        if self.personal.send(number, captcha, mensaje, remitente):
            self.clean()
        else:
            message = 'Captcha incorrecto'
            showerror(title='Error', message=message)
            self.show_captcha()

    def clean(self):
        self.captcha.set('')
        self.ent_msje.delete("1.0", tk.END)
        self.ent_msje.focus_set()
        self.show_captcha()
        return 0

    def show_captcha(self):
        imagen = Image.open(self.personal.get_captcha())
        self.photo = ImageTk.PhotoImage(imagen)

        '''Imagen del captcha'''
        self.captcha_label = tk.Label(self.main_frame, image=self.photo, bd=0)
        self.captcha_label.photo = self.photo
        self.captcha_label.grid(row=3, column=2, sticky=tk.W)
        return 0
예제 #2
0
class Main(QtGui.QDialog):
    """La ventana principal de la aplicación."""

    def __init__(self):
        QtGui.QDialog.__init__(self)

        # Cargamos la interfaz desde el archivo .ui
        uifile = os.path.join(os.path.abspath(os.path.dirname(__file__)), "sms.ui")
        uic.loadUi(uifile, self)

        self.loadContactos()
        self.listContactos()

        self.personal = Personal()
        self.show_captcha()

        self.mensaje_text.setFocus()
        self.validation()

    loadContactos = _loadContactos

    """Metodos para manejar lista de contactos"""

    def saveContactos(self):
        "Guarda las contactos a disco"
        f = open(os.path.expanduser("~/.contactos"), "w")
        f.write(json.dumps(self.contactos))
        f.close()

    def listContactos(self):
        "Muestra las contactos en la lista"
        self.contactoList.clear()
        for nombre, url in self.contactos:
            self.contactoList.addItem(nombre)

    @QtCore.pyqtSlot()
    def on_add_clicked(self):
        addDlg = AddContacto(self)
        r = addDlg.exec_()
        if r:  # O sea, apretaron "Add"
            self.contactos.append((unicode(addDlg.name.text()), unicode(addDlg.number.text())))
            self.saveContactos()
            self.listContactos()

    @QtCore.pyqtSlot()
    def on_edit_clicked(self):
        "Edita el contacto actualmente seleccionado"
        curIdx = self.contactoList.currentRow()
        name, number = self.contactos[curIdx]
        editDlg = EditContacto(self)
        editDlg.name.setText(name)
        editDlg.number.setText(number)
        r = editDlg.exec_()
        if r:  # O sea, apretaron "Save"
            self.contactos[curIdx] = [unicode(editDlg.name.text()), unicode(editDlg.number.text())]
            self.saveContactos()
            self.listContactos()
            self.contactoList.setCurrentRow(curIdx)

    @QtCore.pyqtSlot()
    def on_remove_clicked(self):
        "Borra el contacto actualmente seleccionado"
        curIdx = self.contactoList.currentRow()
        del (self.contactos[curIdx])
        self.saveContactos()
        self.listContactos()

    def on_contactoList_clicked(self):
        curIdx = self.contactoList.currentRow()
        name, number = self.contactos[curIdx]
        self.number_entry.setText(number)
        if self.mensaje_text.toPlainText():
            if self.sender_entry.text():
                if self.captcha_entry.text():
                    self.send.setFocus()
                else:
                    self.captcha_entry.setFocus()
            else:
                self.sender_entry.setFocus()
        else:
            self.mensaje_text.setFocus()

    """Metodos para enviar el mensaje"""

    def validation(self):
        self.number_entry.setMaxLength(10)
        self.captcha_entry.setMaxLength(4)
        re = QtCore.QRegExp("^[0-9]*$")
        validator = QtGui.QRegExpValidator(re, None)
        self.captcha_entry.setValidator(validator)
        self.number_entry.setValidator(validator)

    @QtCore.pyqtSlot()
    def renew_captcha(self):
        self.show_captcha()
        self.captcha_entry.clear()
        self.captcha_entry.setFocus()

    @QtCore.pyqtSlot()
    def clean_all(self):
        self.mensaje_text.clear()
        self.captcha_entry.clear()
        self.mensaje_text.setFocus()
        self.show_captcha()

    @QtCore.pyqtSlot()
    def show_captcha(self):
        imagenpath = self.personal.get_captcha()
        imagen = Qt.QPixmap(imagenpath)
        self.captcha.setPixmap(imagen)

    @QtCore.pyqtSlot()
    def send_sms(self):
        mensaje = self.mensaje_text.toPlainText()
        mensaje = unicode(mensaje)
        remitente = self.sender_entry.text()
        remitente = unicode(remitente)
        numero = self.number_entry.text()
        if numero.length() != 10:
            QtGui.QMessageBox.information(self, u"Error", u"Número incorrecto")
            return 2
        captcha = self.captcha_entry.text()

        if self.personal.send(numero, captcha, mensaje, remitente):
            return 0
        else:
            return 1

    @QtCore.pyqtSlot()
    def on_send_clicked(self):
        answer = self.send_sms()
        if not answer:
            self.clean_all()
        elif answer == 1:
            QtGui.QMessageBox.warning(self, u"Error", u"Captcha incorrecto")
            self.renew_captcha()
        else:
            self.number_entry.setFocus()