¿Problemas de Ortografía? La R.A.E. y Python Raudas Al Rescate.

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

049-053_Python_Linux3 15.02.

2005 18:15 Uhr Pgina 49

Python

DESARROLLO

Problemas de ortografa? La R.A.E. y Python raudas al rescate.

Python y Palabra Empiezan por P

Desde que lleg Internet todos escribimos ms. Se supone que con los ordenadores y sus fabulosos correctores ortogrficos y gramaticales no volveramos a cometer errores garrafales al hescrivir. La realidad es que, a pesar de estas ayudas, cuando escribimos a travs de los sistemas de mensajera o en los correos solemos usar argot, lo que nos obliga a desactivar los correctores. Es entonces, despus de escribir mil veces k en lugar de que, al enfrentarnos a escribir algo normal comienzan a asaltarnos dudas esto era con b o con v? Existe esta palabra?.
POR JOS MARA RUZ Y JOS PEDRO ORANTES

anto GNOME como KDE disponen de sendas aplicaciones para consultar diccionarios. A nosotros nos resultan muy tiles cuando, por ejemplo, aparece en alguna pgina o documento una palabra de argot o difcil en ingls. Entonces recurrimos a ellas, realizan consultas en prestigiosos diccionarios

como el Webster o en el famossimo (a la par que desternillante) Jargon file. Pero no todo el mundo est dispuesto a usar GNOME o KDE (al menos uno de nosotros no lo hace), as que parece un poco desmedido instalar todo un escritorio grfico solamente para tener acceso a un programa que podemos realizar sin

demasiada dificultad usando nuestro querido Python y el maravilloso Tkinter.

Hablando con el servidor de la R.A.E.


La R.A.E. (Real Academia de la lengua Espaola) tiene una pgina web (http:// www.rae.es) donde podemos consultar el

www.linuxmagazine.com.es

Nmero 03

49

049-053_Python_Linux3 15.02.2005 18:15 Uhr Pgina 50

DESARROLLO

Python

parmetros seleccionemos nosotros, lo que nos permitir hablar con el servidor directamente sin necesidad de usar un navegador. De esta manera podemos crear programas que salten el paso del navegador y accedan directamente al servidor HTTP. Ese es nuestro objetivo. Tenemos que localizar Figura 1: Nuestra utilidad busca-palabras en marcha. esos parmetros en el servidor HTTP de la R.A.E. en la pgina diccionario o realizar preguntas sobre de bsqueda de palabras. dudas lingsticas. Tener que acceder a esa pgina es un poco engorroso si lo vas Localizando los Parmetros a hacer ms de una vez. A pesar de todas esas buzzwords (que Ahora comienza nuestra labor de detecsi PHP, que si J2EE, que si .NET) al final tives. Primero accedemos a la pgina de todo acceso a un servidor web se realiza la R.A.E y pinchamos en Diccionario de a travs del protocolo HTTP. Este protola lengua espaola, lo primero que nos colo no posee estados y, bsicamente, debera extraar es que la URL no ha sirve para pedir ficheros. En teora cambiado, sigue siendo http://www.rae. implementa varios tipos de mensajes, de es. Eso significa que nuestro browser los cuales solo el GET y el POST se utiest volviendo a pedir el mismo objeto al lizan (existe otros ms, como PUT que servidor HTTP, pero lo que vemos es una nos permitira depositar archivos, pero pgina distinta. Esto puede significar casi nadie lo usa). GET sirve para pedir varias cosas, pero una inspeccin del un fichero a travs de una URL y POST cdigo HTML de la pgina nos dice que para enviar informacin al servidor se estn usando FRAMES. HTTP. El W3C [1], entidad que gestiona Desde este punto de vista, un servidor HTTP solo ve dos cosas: archivos Listado 1: Programa que le pedimos y datos que le damos. buscador.py Tanto GET como POST se pueden utilizar para pasar informacin al servidor. 01 #!/usr/local/bin/python Ambos tienen ventajas e inconve02 nientes. Generalmente se usa GET, 03 from popen2 import popen2 porque los parmetros que pasamos al 04 from sys import argv servidor van incluidos en la URL. De 05 esta manera podemos pasarle una URL 06 def busca_palabra(palabra): a alguien o ponerla en nuestra pgina y 07 salida, entrada = cualquiera podr ver la pgina con los popen2('lynx -dump --nolist parmetros que nosotros selec"http://buscon.rae.es/draeI/Sr cionamos. Con POST esto no es posible, vltGUIBusUsual?TIPO_HTML=2&LEM ya que los parmetros no estn preA=' + palabra + '"') sentes en la URL. Los estndares dicen 08 entrada.close() que GET debe usarse para pasar 09 cadena = salida.read() parmetros (opciones por ejemplo) 10 print(cadena) mientras que POST debe ser usado para 11 mandar informacin al servidor que 12 if __name__ == "__main__": posteriormente sea almacenada. 13 if ( len(argv) == 1 ): Si entramos en una pgina web y 14 print("ERROR: hace prestamos atencin a las URLs que se falta un argumento") van generando podemos encontrar las 15 else: opciones que acepta esa pgina. Si las 16 busca_palabra(argv[1]) localizamos podemos crear URLs cuyos

muchos de los estndares de la web, desaconseja el uso de FRAMESET, la razn es que engaan a las URLs y al usuario. Por ejemplo, estoy diciendo que estamos en la pgina de bsqueda del diccionario de la R.A.E., pero la URL sigue siendo la de la pgina principal de la R.A.E. (http://www.rae.es), as que no podemos deciros que vayis a esa URL porque no se corresponde con la de bsqueda en el diccionario. Por ello los FRAMES destruyen la idea de que una URL, una direccin, corresponde a un solo objeto en la red. La pgina de bsqueda la componen 2 FRAMES ( o subpginas): cabecera y portada. La cabecera no nos interesa. La portada a su vez la componen los FRAMES: eleccin y presentacin. Este ltimo es el que presenta los resultados de la bsqueda pero como sabe a qu palabra nos estamos refiriendo? Cada FRAME contiene varias pginas, y los FRAMES se disearon para mostrar varias pginas la vez. A nosotros solo nos importa una pgina: http://buscon. rae.es/draeI/SrvltGUIBusUsual. Esta pgina es la que acepta un parmetro, LEMA, y devuelve una web con la definicin (o un aviso de fallo) de LEMA. El mtodo usado es POST, lo sabemos porque si vemos la informacin de la pgina, los parmetros pasados son LEMA de tipo POST. Pero muchas aplicaciones web, en particular la que usar Servlets de Java, suelen buscar los parmetros tanto en POST como en GET. Y ste es nuestro caso. Cmo se pasan parmetros? Pues muy sencillo, vamos a usar GET. Se pone la URL y se le aade ?<PARAMETRO1>=<VALOR1>&<PARAMETRO2>=<VALOR2>. Por ejemplo: http://buscon.rae.es/draeI/ SrvltGUIBusUsual?LEMA=hola. Ahora tenemos que ver como es posible obtener el contenido de esa URL.

Lynx al Rescate
Podramos haber diseado algn complejsimo sistema, para traer la pgina HTML, eliminarle las etiquetas, formatearla y dems; pero la vagancia, aliada poderosa del buen programador, nos hace buscar una manera ms simple de hacer esto. La manera ms simple, consistira en seguir el ejemplo de xdrae [2]. Esta apli-

50

Nmero 03

www.linuxmagazine.com.es

049-053_Python_Linux3 15.02.2005 18:15 Uhr Pgina 51

Python

DESARROLLO

cacin, realizada en Tcl/Tk, descansa en otro programa, lynx, para obtener el resultado de las bsquedas parseado y en formato texto. Esto nos ensea un leccin muy importante de la manera en que UNIX entiende la reutilizacin de cdigo. La manera propuesta por UNIX es la creacin de utilidades compactas y pequeas que puedan ser conectadas mediantes tuberas (por ejemplo ls -l | wc -l). Para que esto sea posible, las salidas deben ser en formato texto. lynx acepta multitud de parmetros pero posee uno, -dump, que hace que vuelque en la salida estndar la pgina, pero ya formateada de manera que es ASCII sin etiquetas HTML. Si lo hacemos as, lynx nos volcar la pgina formateada ms una lista de todos las URLs de los hipervnculos de la misma. Para que no lo haga aadimos --nolist. Nos quedara al final algo as: lynx -dump --nolist URL.

Listado 2: Programa buscador2.py


01 #!/usr/local/bin/python 02 03 from popen2 import popen2 04 from Tkinter import * 05 from Tkconstants import * 06 07 class GUI: 08 09 10 self.crea_panel_busca() 11 self.crea_panel_muestra() 12 13 14 15 16 17 def arranca(self): mainloop() def busca_palabra(self): self.label_estado.config(text= "Estado: buscando palabra...") palabra = self.entry_palabra.get(); salida, entrada = popen2('lynx -dump --nolist "http://buscon.rae.es/draeI/Sr vltGUIBusUsual?LEMA=' + palabra + '"') entrada.close() texto = salida.read() # Borramos el texto que hubiese antes self.label_estado.config(text= "Estado: mostrando texto") 24 self.text_muestra.delete(1.0,E ND) 25 self.text_muestra.insert(1.0,t exto) 26 salida.close() 27 28 def crea_panel_muestra(self): 29 self.panel_muestra = Frame(self.root) 30 self.panel_muestra.pack() 31 32 33 34 # Vinculamos una barra de desplazamiento self.scrollbar= Scrollbar(self.panel_muestra) 53 self.btn_salir.pack(side=RIGHT ) 54 55 self.btn_busca = Button(self.panel_busca, text='Buscar', command=self.busca_palabra) 56 self.btn_busca.pack(side=RIGHT ) 57 58 if __name__ == "__main__": 59 60 61 app = GUI() app.arranca() 40 41 39 self.text_muestra.pack() def def __init__(self): self.root = Tk() 35 36 self.scrollbar.pack(side=RIGHT ,fill=Y) # Caja de texto para

mostrar la definicin de la 37 # palabra 38 self.text_muestra = Text(self.panel_muestra, yscrollcommand = self.scrollbar.set)

crea_panel_busca(self): 42 self.panel_busca = Frame(self.root) 43 self.panel_busca.pack() 44 45 self.label_estado = Label(self.panel_busca, text="Estado: parado") self.label_estado.pack(side=LE FT) 47 48 49 self.entry_palabra.pack(side=L EFT) 50 51 52 # Botn de salida self.btn_salir = Button(self.panel_busca,text=" Salir", command= self.root.destroy) self.entry_palabra = Entry(self.panel_busca)

18 19

popen2
Para poder recoger lo que lynx genera tenemos que crear una tubera entre l y nosotros. Para ello existe la funcin popen2 de la librera del mismo nombre. Esta funcin ejecuta un programa y crea dos descriptores de fichero, uno para mandarle texto al programa y otro para recibirlo. Se corresponden con la entrada y la salida estndar del programa que se ejecuta. La idea es ejecutar lynx... con popen2. Su entrada estndar no nos interesa, as que la cerramos, pero la salida estndar es lo que buscbamos. Una vez ejecutado popen2, el volcado de lynx... puede ser ledo como si leysemos un fichero.
>>> salida, entrada = popen2U ("wc -w") >>> entrada.write("En un lugarU de la mancha de cuyo nombre noU quiero acordarme") >>> entrada.close() >>> print salida.read() 12 >>>

46

20 21 22 23

wc -w devuelve el nmero de palabra que son ledas de su entrada estndar hasta el fin de fichero (por eso tenemos que hacer un entrada.close()).

www.linuxmagazine.com.es

Nmero 03

51

049-053_Python_Linux3 15.02.2005 18:15 Uhr Pgina 52

DESARROLLO

Python

a campo_texto y a boton1 dentro de panel. Veamoslo en prctica con un hola mundo.


01 >>> import Tkinter 02 >>> from Tkconstants import * 03 >>> tk = Tkinter.Tk() 04 >>> 05 >>> panel = Tkinter.Frame(tk, relief=RIDGE, borderwidth=2) 06 >>> panel.pack(fill=BOTH, expand=1) 07 >>> 08 >>> etiqueta = Tkinter.Label (panel, text="Hola Linux Magazine") 09 >>> etiqueta.pack(fill=X, expand=1) 10 >>> 11 >>> boton = Tkinter.Button (panel,text="Salir", command=tk.destroy) 12 >>> boton.pack(side=BOTTOM) 13 >>> 14 >>> tk.mainloop()

Figura 2: Pgina del diccionario de la RAE.

Ahora solo tenemos que ejecutar nuestro comando lynx... y leer su salida, almacenando el valor en una variable.

Script de Consulta Sencillo


xdrae hace uso de esta metodologa de trabajo, invocando a lynx, que realiza la mayor parte del trabajo pesado, dejndole a xdrae la gestin del GUI. Un script sencillo para que consigamos el mismo resultado sera el del Listado 1. Cuando Python comenz a tener expansin se hizo evidente la necesidad de un sistema para la creacin de interfaces grficos. Pudieron hacer lo mismo que en Java y crear su propio sistema (AWT y Swing), pero en lugar de eso reutilizaron uno ya existente: Tcl/Tk.

de empotrar en aplicaciones realizadas en C. La idea era que el usuario pudiese extender la funcionalidad de la aplicacin sin tener que ponerse a programar en C, sino creando scripts que la aplicacin ejecutara. Al poco tiempo comenz a trabajar en Tk, una extensin de Tcl que permitira la creacin de interfaces grficos de manera rpida y simple gracias a Tcl. Aunque no hayamos escuchado hablar mucho de Tcl/Tk, su importancia en el software es muy grande, muchos lenguajes usan Tk como libreras grficas. Tcl/ Tk se ha usado mucho en el prototipado de aplicaciones.

El hola mundo Grfico


Despus de esta pequea leccin de historia, pongmonos manos a la obra. Lo primero que necesitamos saber es como estructura Tk los widgets (usaremos esta palabra a partir de ahora, viene a significar elementos grficos). Tk usa un rbol, como el rbol de directorios, pero en lugar de usar el smbolo / y usa el punto, .. La aplicacin se crea desde la raz, . hacia adelante. Los widgets pueden contener otros widgets, o sea, los widgets pueden ser directorios de otros widgets. As podemos tener un widget .panel que tenga dos hijos .panel.campo_texto y .panel.boton1. Visualmente veramos

Tcl/Tk
Tcl/Tk son unas siglas extraas, pueden recordarnos a TCP/IP y la verdad es que algo comparten con ellas. Tanto Tcl/Tk como TCP/IP hacen referencia a 2 tecnologas que trabajan juntas. En el caso de Tcl/Tk estas tecnologas son el lenguaje script Tcl y el sistema de interfaz grfico de usuario Tk. Tk fue creado despus que Tcl, y est realizado como una extensin de Tcl. Tcl fue creado por el profesor John K. Ousterhout con el objetivo de disponer de un lenguaje script que fuese sencillo

El mtodo pack posiciona los widgets dentro de su widget padre, si le especificamos side=BOTTOM los ir posicionando uno encima de otro; fill=X sirve para que el widget ocupe todo el espacio horizontal (con fill=Y ocupara el vertical y con fill=XY todo el espacio disponible); expand=1 hace que el widget crezca si su padre crece, en caso contrario no modificar sus dimensiones. Tk funciona de la siguiente manera. Primero se construye el interfaz grfico. Cada elemento del interfaz responde a una serie de eventos (ser pulsado, que el ratn pase por encima) y cada uno de estos eventos puede estar vinculado con un procedimiento que se dispara al ocurrir el evento. As que asignamos procedimientos a los eventos de los widgets. Por ltimo entramos en el bucle principal (main loop). Todas las invocaciones a las funciones de creacin de widgets tienen un primer argumento, en l se especifica de quien cuelga (o dentro de quien est) nuestro widget. Aqu el widget tk representa la ventana, dentro de la cual hay un panel y dentro del cual hay dos widgets, una etiqueta y un botn. El botn tiene vinculado un comando, en este caso tk.destroy, pero podra

52

Nmero 03

www.linuxmagazine.com.es

049-053_Python_Linux3 15.02.2005 18:15 Uhr Pgina 53

Python

DESARROLLO

Figura 4: Hola Mundo de Tcl/Tk.

Ensamblaje Final
Y ahora llega el momento que estbamos esperando, cuando todas estas tcnicas e ideas se ponen juntas y aparece algo til. Bsicamente lo que hace nuestra aplicacin es crear un objeto GUI. ste se encarga de crear y vincular la acciones que los widget requieren. Una vez creadas, es necesario invocar el mtodo arranca() que ejecuta el bucle principal de Tk. Este bucle se dedica a repintar la ventana y gestionar los eventos. El encargado de buscar en la R.A.E. una palabra a travs del botn Buscar es el mtodo busca_palabra, ejecuta lynx con las opciones necesarias y con el contenido del campo de entrada. Lo hace a tras de popen2. Cuando est listo el texto, borra el contenido del widget de texto e inserta en l el texto devuelto por el servidor HTTP de la R.A.E.. Cada vez que se hace esto, la aplicacin queda bloqueada como resultado de la invocacin a popen2, que bloquea a nuestra aplicacin hasta que termine de ejecutarse lynx. Para evitar este problema se deben emplear hebras, pero eso est fuera del alcance de ste artculo. Cuando se pulsa el botn Salir la aplicacin acaba. s

Figura 3: Buscador desde la lnea de comandos.

haber sido otro. Podramos haber incorporado otro botn antes de ejecutar el tk.mainloop():
>>> def escribe(): ... print "Hola mundo" ... >>> >>> boton2 = Tkinter.ButtonU (panel, text="Escribe",U command= escribe ) >>> boton2.pack(side=BOTTOM)

Habra otro botn, debajo de el botn Salir, que al pulsarlo escribira por la salida estndar (normalmente la consola) el texto Hola mundo.

Diseo de la aplicacin
Tk tiene todos los widgets que existen en el resto de GUIs. Tenemos etiquetas, botones, paneles, imgenes, combos y dems. Nosotros lo que necesitamos es: Un panel Una etiqueta Estado, un campo de entrada de texto, un botn Buscar y otro Salir. Un widget de texto con mltiples lneas para la respuesta, con una barra de desplazamiento asociada. Deberamos tambin darle un ttulo a la ventana.

Barras de desplazamiento + Campos de texto = algo muy til


Un widget de texto es un widget que nos permite mostrar una gran cantidad de texto. Posee infinidad de opciones, sien-

do posible implementar con ellas hasta un intrprete de HTML o crear texto enriquecido. Vamos a usar un widget de texto para contener la respuesta del servidor de la R.A.E.. Tenemos que solucionar el problema de que la respuesta de la R.A.E. sea mayor que el contenido de nuestro campo. Nuestro widget de texto no va ser redimensionable y puede que haya ms texto del que quepa en el rea que vemos del widget de texto. Para solucionar este problema, se inventaron las barras de desplazamiento, que damos por sentadas, pero que fueron toda una innovacin en su da. La idea es crear una barra de desplazamiento y vincular su movimiento y tamao al texto mostrado en el widget de texto que tendr asociada. En Tk el tamao no es posible vincularlo, pero podemos vincular el movimiento. Algunos widgets, aquellos propensos a usar una barra de desplazamiento, poseen un evento llamado yscrollcommand, que toma un valor de una funcin y lo usa para posicionar el texto dentro del widget. El widget tiene un elemento llamado viewport, que es la ventana dentro de todo lo que tiene el widget que puede ver el usuario. El widget puede tener, aprovechando la coyuntura, El Quijote pero en el viewport solo se ven unos cuantos prrafos de la obra de Cervantes. Cuando vinculamos una barra de desplazamiento con un widget de texto en realidad lo que hacemos es que vinculamos el valor de inicio del viewport con el de la barra de desplazamiento.

RECURSOS
[1] W3C http://www.w3c.org [2] Pgina de xdrae http://xinfo.sourceforge. net/xdrae.html

Jos Mara Ruiz actualmente est realizando el Proyecto Fin de Carrera

LOS AUTORES

de Ingeniera Tcnica en Informtica de Sistemas. Lleva 7 aos usando y desarrollando software libre y, desde hace dos, se est especializando en FreeBSD. Pedro Orantes est cursando 3 de Ingeniera Tcnica en Informtica de Sistemas.

www.linuxmagazine.com.es

Nmero 03

53

También podría gustarte