Python permite a los desarrolladores diseñar aplicaciones de escritorio. En este tutorial, vamos a crear una aplicación de escritorio en Python y un archivo ejecutable para Windows. La aplicación va a ser simple: Permitirá a los usuarios seleccionar un artículo de una lista, harán clic en leer y el artículo se abrirá en su navegador. Vamos a utilizar Tkinter para craftear el GUI que nuestra aplicación necesita.
Nuestra aplicación importa los siguientes módulos:
from Tkinter import * import webbrowser import os import data
Los datos son de nuestro propio módulo (file) que contienen una lista con los diccionarios de los distintos artículos que el usuario se va a encontrar. Estos diccionarios incluyen los títulos y las URLs de dichos artículos.
El módulo de datos se parece a lo siguiente:
articleList = [ {'name': "Edición inline HTML5 con PHP, MySQL y AJAX", 'url': "http://programacion.net/articulo/edicion_inline_html5_con_php-_mysql_y_ajax_1560" }, {'name': "Los 6 mejores generadores de código CSS", "url": "http://programacion.net/articulo/los_6_mejores_generadores_de_codigo_css_1559"}, ....
El Webbrowser nos permite abrir el navegador del usuario a diferentes sitios web y el módulo os contiene métodos de utilidad, como un método que nos permite unir rutas de forma independiente al sistema operativo u obtener el nombre del sistema operativo.
def __init__(self, master=None): Frame.__init__(self,master) self.pack() self.articleList = data.articleList self.readingInformation = None self.createWidgets()
Creamos una clase llamada Reader, la cual aceptará el sframe de Tkinter. Creamos también el método __init__ que funciona de la misma manera que el __construct__ de PHP y nos permitirá ejecutar la lógica cada vez que se cree una instancia de nuestra clase.
En él, definimos algunas de las propiedades que va a tener la clase. articlelist contendrá los datos que queremos mostrar en la aplicación y readingInformation contendrá el mensaje que se muestra a los usuarios cuando abren un artículo. Después, llamamos al método createWidgets en nuestra clase.
El método createWidgets itera la lista con los diccionarios y crea una nueva lista que contiene sólo el título de cada artículo. A continuación, se crea una variable llamada optionSelected que albergará el título que está actualmente seleccionado y lo pondrá como el primer artículo en la lista.
Posteriormente, creamos OptionMenu y la pasamos la variable de las opciones seleccionadas que hemos recuperado y también le pasamos la lista completa de los artículos que se añadirán como opciones. Le damos a OptionMenu un fondo verde y lo empaquetamos. Luego, creamos un Button, establecemos su texto, el color del texto, el fondo y le proporcionamos un callback que se ejecutará cuando se haga clic en el botón con la ayuda de la key command. En nuestro caso, se ejecuta el método readArticle, de la clase Reader. Por último, creamos una label que se corresponderá al texto que se mostrará en la parte inferior de la ventana. El segundo parámetro llamado textVariable nos permitiría cambiar el texto de la etiqueta en cualquier lugar de nuestra lógica de la aplicación. A continuación, definimos la fuente a una letra Arial y un tamaño de 16 con la ayuda de la key font. Por último, definimos el color de fuente a hexadecimal y empaquetamos el label.
def createWidgets(self): articleNamesOnly = [] for x in self.articleList: articleNamesOnly.append(x['name']) self.optionSelected = StringVar(self.master) self.optionSelected.set(articleNamesOnly[0]) # initial value option = OptionMenu(self.master, self.optionSelected, *articleNamesOnly) option['bg'] = "green" option.pack() readBtn = Button(self) readBtn["text"] = "Read" readBtn["fg"] = "white" readBtn['bg'] = "crimson" readBtn["command"] = self.readArticle readBtn.pack() self.readingInformation = StringVar() readingLabel = Label(self.master, textvariable=self.readingInformation) readingLabel['font'] = ("Arial", "16") readingLabel['fg'] = "#666" readingLabel.pack()
El método readArticle que se ejecuta cuando se hace clic en el botón, encuentra la URL del artículo que ha sido seleccionado (recuerda que tienes el título de artículo guardado en la propiedad optionSelected), lo abre en el navegador del usuario y modifica el texto del label.
def readArticle(self): url = "" for x in self.articleList: if x['name'] == self.optionSelected.get(): url = x['url'] break self.readingInformation.set("Reading " + self.optionSelected.get() + "!") webbrowser.open(url)
Finalmente, creamos la app de Tkinder, definimos el título de la ventana de nuestra aplicación y añadimos un icono a la ventana de la aplicación (una imagen que esté en la misma carpeta que donde se encuentre el actual fichero .py).
root = Tk() root.wm_title("Web Development Articles Reader | programacion.net") if "nt" == os.name: root.wm_iconbitmap(bitmap = "favicon.ico") else: root.wm_iconbitmap(bitmap = "@favicon.xbm") app = Reader(master=root) app.mainloop()
Compilando la aplicación de Python en un ejecutable para Windows
Para hacer el ejecutable vamos a utilizar PyInstaller. Si has instalado Python correctamente, solo tendrás que abrir tu terminal y escribir pip install PyInstaller para llevarlo a cabo. De lo contrario, habría que establecer la ruta a la carpeta de Python y la ruta de la carpeta de scripts de Python en su variable de entorno PATH (algo así como C:/python27 y C:/python27/Scripts de Python 2.7).
Ahora, vete a la carpeta donde está tu aplicación y ejecuta pyinstaller.exe FILENAME.py-OneFile -icon = favicon.ico para crear un único archivo ejecutable (.exe) desde tu aplicación. En nuestro caso, después de crearla tendríamos que añadir los dos archivos de iconos en el directorio donde está el ejecutable. De otro modo no estarían disponibles y la aplicación se bloquearía.
Fuente: phpgang.com