{"id":188,"date":"2020-06-26T19:02:31","date_gmt":"2020-06-26T17:02:31","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=188"},"modified":"2020-06-27T10:17:00","modified_gmt":"2020-06-27T08:17:00","slug":"tkinter-generar-passwords","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=188","title":{"rendered":"tkinter: Generar passwords"},"content":{"rendered":"\n<p>Vamos a probar tkinter para hacer una aplicaci\u00f3n con interface gr\u00e1fico. Esta aplicaci\u00f3n mostrar\u00e1 una contrase\u00f1a de un tama\u00f1o determinado por la variable <strong>ancho<\/strong>.<\/p>\n\n\n\n<p>Lo primero que hay que hacer es importar <strong>tkinter<\/strong>, en el c\u00f3digo se importa como tk<strong>,<\/strong> as\u00ed mas adelante nos referiremos a ella como <strong>tk<\/strong>.<\/p>\n\n\n\n<p>El m\u00f3dulo <strong>random<\/strong> nos servir\u00e1 para seleccionar caracteres aleatorios de una lista, para ello haremos uso del m\u00e9todo <strong>choice<\/strong>, al cual pasaremos el argumento <strong>k=cantidad_caracteres_a_seleccionar<\/strong>.<\/p>\n\n\n\n<p>Tambi\u00e9n importaremos el m\u00f3dulo <strong>string<\/strong> que nos servir\u00e1 para poder hacer una lista combinada con letras y s\u00edmbolos.<\/p>\n\n\n\n<p>Tras esto creamos una clase del tipo <strong>tk.Frame<\/strong>, la cual heredar\u00e1 todas sus caracter\u00edsticas. El constructor __init__  tiene como primer argumento el nombre de la clase <strong>self<\/strong> y como segundo <strong>master=None<\/strong> que  es el valor por defecto.<\/p>\n\n\n\n<p>Gracias a <strong>super() <\/strong>se heredan los valores del constructor padre y adem\u00e1s a\u00f1adimos valores adicionales, como son: caracteres que contiene la lista de letras y s\u00edmbolos, password que servir\u00e1 para alojar el password, ancho = 8 que ser\u00e1 el tama\u00f1o en caracteres del password.<\/p>\n\n\n\n<p>Usamos pack() que es la forma mas f\u00e1cil para poner widgets en fila uno detr\u00e1s de otro y seguidamente escribimos tres m\u00e9todos de la clase MiApp que son las que construir\u00e1n los 3 widgets que contiene la aplicaci\u00f3n y que son un bot\u00f3n para dar la orden de generaci\u00f3n del password, una caja de texto para escribir las contrase\u00f1as y poder copiar\/pegar y un bot\u00f3n para cerrar la aplicaci\u00f3n.<\/p>\n\n\n\n<p>La generaci\u00f3n de cada uno de los widgets se hace, declarando una variable de la clase y asign\u00e1ndole el widget en primer lugar. Para ello se usa <strong>tk.Button()<\/strong> para asignar un bot\u00f3n y <strong>tk.Entry()<\/strong> 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).<\/p>\n\n\n\n<p>Lo siguiente ir a\u00f1adiendo las caracter\u00edsticas del widget, como son el texto que contienen, el m\u00e9todo al que llamar\u00e1n los botones sin se pulsan: <strong>command<\/strong> y el <strong>pack()<\/strong> con el lado donde se posicionar\u00e1 el widget. El bot\u00f3n de cerrar hace uso de un m\u00e9todo heredado que destruye el objeto tkinter creado.<\/p>\n\n\n\n<p>El m\u00e9todo _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\u00e1s imprime la contrase\u00f1a por la consola.<\/p>\n\n\n\n<p>Para instanciar la clase, creamos un objeto root que es una instancia de tkinter.Tk(), cambiamos el t\u00edtulo modificando el par\u00e1metro <strong>title<\/strong>, 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.<\/p>\n\n\n\n<p>Lo \u00faltimo es crear una instancia de nuestra clase MiApp a la que pasamos como argumento master el objeto obtenido anteriormente con el t\u00edtulo y posiciones modificados, y llamamos al m\u00e9todo <strong>mainloop()<\/strong> para generar un bucle que haga que el programa gr\u00e1fico siga funcionando hasta que se pulse la x superior o el bot\u00f3n Cerrar.<\/p>\n\n\n\n<p>El c\u00f3digo completo es el siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import tkinter as tk\nimport random\nimport string\n\n\nclass MiApp(tk.Frame):\n    def __init__(self, master=None):\n        super().__init__(master)\n        self.caracteres = list(string.ascii_letters+string.punctuation)\n        self.password = ''\n        self.ancho = 8\n        self.master = master\n        self.pack()\n        self.btnPassword()\n        self.txtPassword()\n        self.btnQuit()\n\n    def btnPassword(self):\n        self._btnPassword = tk.Button(self)\n        self._btnPassword[\"text\"] = \"Contrase\u00f1a nueva\"\n        self._btnPassword[\"command\"] = self._nuevoPassword\n        self._btnPassword.pack(side=\"left\")\n\n    def txtPassword(self):\n        self.sv_txtPassword = tk.StringVar(self)\n        self._txtPassword = tk.Entry(self, textvariable=self.sv_txtPassword)\n        self._txtPassword['width'] = 32\n        self._txtPassword.pack(side=\"left\")\n\n    def btnQuit(self):\n        self._btnQuit = tk.Button(self)\n        self._btnQuit[\"text\"] = \"Cerrar\"\n        self._btnQuit[\"fg\"] = \"red\"\n        self._btnQuit[\"command\"] = self.master.destroy\n        self._btnQuit.pack(side=\"right\")\n\n    def _nuevoPassword(self):\n        self.password = ''.join(random.choices(self.caracteres, k=self.ancho))\n        self.sv_txtPassword.set(self.password)\n        print(self.password)\n\n\nroot = tk.Tk()\nroot.title('Contrase\u00f1as')\n\nancho = root.winfo_reqwidth()\nalto = root.winfo_reqheight()\npos_izquierda = int(root.winfo_screenwidth()\/2 - ancho\/2)\npos_superior = int(root.winfo_screenheight()\/2 - alto\/2)\nroot.geometry(\"+{}+{}\".format(pos_izquierda, pos_superior))\n\napp = MiApp(master=root)\napp.mainloop()\n<\/code><\/pre>\n\n\n\n<p>Y el resultado el siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"471\" height=\"59\" src=\"https:\/\/www.pythonparatodo.com\/wp-content\/uploads\/2020\/06\/tkinter_password.png\" alt=\"tkinter_password\" class=\"wp-image-192\" srcset=\"https:\/\/www.pythonparatodo.com\/wp-content\/uploads\/2020\/06\/tkinter_password.png 471w, https:\/\/www.pythonparatodo.com\/wp-content\/uploads\/2020\/06\/tkinter_password-300x38.png 300w\" sizes=\"auto, (max-width: 471px) 100vw, 471px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a probar tkinter para hacer una aplicaci\u00f3n con interface gr\u00e1fico. Esta aplicaci\u00f3n mostrar\u00e1 una contrase\u00f1a de un tama\u00f1o determinado &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,83],"tags":[85,6,62,84],"class_list":["post-188","post","type-post","status-publish","format-standard","hentry","category-python","category-tkinter","tag-passwords","tag-python3","tag-random","tag-tkinter"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=188"}],"version-history":[{"count":3,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/188\/revisions"}],"predecessor-version":[{"id":193,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/188\/revisions\/193"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}