tkinter: Generar passwords

Vamos a probar tkinter para hacer una aplicación con interface gráfico. Esta aplicación mostrará una contraseña de un tamaño determinado por la variable ancho.

Lo primero que hay que hacer es importar tkinter, en el código se importa como tk, así mas adelante nos referiremos a ella como tk.

El módulo random nos servirá para seleccionar caracteres aleatorios de una lista, para ello haremos uso del método choice, al cual pasaremos el argumento k=cantidad_caracteres_a_seleccionar.

También importaremos el módulo string que nos servirá para poder hacer una lista combinada con letras y símbolos.

Tras esto creamos una clase del tipo tk.Frame, la cual heredará todas sus características. El constructor __init__ tiene como primer argumento el nombre de la clase self y como segundo master=None que es el valor por defecto.

Gracias a super() se heredan los valores del constructor padre y además añadimos valores adicionales, como son: caracteres que contiene la lista de letras y símbolos, password que servirá para alojar el password, ancho = 8 que será el tamaño en caracteres del password.

Usamos pack() que es la forma mas fácil para poner widgets en fila uno detrás de otro y seguidamente escribimos tres métodos de la clase MiApp que son las que construirán los 3 widgets que contiene la aplicación y que son un botón para dar la orden de generación del password, una caja de texto para escribir las contraseñas y poder copiar/pegar y un botón para cerrar la aplicación.

La generación de cada uno de los widgets se hace, declarando una variable de la clase y asignándole el widget en primer lugar. Para ello se usa tk.Button() para asignar un botón y tk.Entry() para asignar la caja de texto. El primer argumento ha de ser el nombre de la clase por eso se escribe tk.Button(self) o tk.Entry(self).

Lo siguiente ir añadiendo las características del widget, como son el texto que contienen, el método al que llamarán los botones sin se pulsan: command y el pack() con el lado donde se posicionará el widget. El botón de cerrar hace uso de un método heredado que destruye el objeto tkinter creado.

El método _nuevoPassword() selecciona los caracteres del ancho deseado, lo ponen en un widget del tipo StringVar creado anteriormente para facilitar la forma de cambiar el texto del widget Entry y además imprime la contraseña por la consola.

Para instanciar la clase, creamos un objeto root que es una instancia de tkinter.Tk(), cambiamos el título modificando el parámetro title, e intentamos colocar la ventana en el centro de nuestra pantalla averiguando las posiciones superiores e izquierda y restandoles la mitad del valor del ancho y alto de la ventana.

Lo último es crear una instancia de nuestra clase MiApp a la que pasamos como argumento master el objeto obtenido anteriormente con el título y posiciones modificados, y llamamos al método mainloop() para generar un bucle que haga que el programa gráfico siga funcionando hasta que se pulse la x superior o el botón Cerrar.

El código completo es el siguiente:

import tkinter as tk
import random
import string


class MiApp(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.caracteres = list(string.ascii_letters+string.punctuation)
        self.password = ''
        self.ancho = 8
        self.master = master
        self.pack()
        self.btnPassword()
        self.txtPassword()
        self.btnQuit()

    def btnPassword(self):
        self._btnPassword = tk.Button(self)
        self._btnPassword["text"] = "Contraseña nueva"
        self._btnPassword["command"] = self._nuevoPassword
        self._btnPassword.pack(side="left")

    def txtPassword(self):
        self.sv_txtPassword = tk.StringVar(self)
        self._txtPassword = tk.Entry(self, textvariable=self.sv_txtPassword)
        self._txtPassword['width'] = 32
        self._txtPassword.pack(side="left")

    def btnQuit(self):
        self._btnQuit = tk.Button(self)
        self._btnQuit["text"] = "Cerrar"
        self._btnQuit["fg"] = "red"
        self._btnQuit["command"] = self.master.destroy
        self._btnQuit.pack(side="right")

    def _nuevoPassword(self):
        self.password = ''.join(random.choices(self.caracteres, k=self.ancho))
        self.sv_txtPassword.set(self.password)
        print(self.password)


root = tk.Tk()
root.title('Contraseñas')

ancho = root.winfo_reqwidth()
alto = root.winfo_reqheight()
pos_izquierda = int(root.winfo_screenwidth()/2 - ancho/2)
pos_superior = int(root.winfo_screenheight()/2 - alto/2)
root.geometry("+{}+{}".format(pos_izquierda, pos_superior))

app = MiApp(master=root)
app.mainloop()

Y el resultado el siguiente:

tkinter_password

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *