<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3585005229267063154</id><updated>2011-11-27T20:22:46.186-05:00</updated><category term='Sugar'/><category term='python'/><title type='text'>El ingenio azucarero</title><subtitle type='html'>Ingenio para hacer Azucar a partir de Caña (o como hacer una Actividad en python para Sugar)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-9153925559924185124</id><published>2009-05-12T09:15:00.005-05:00</published><updated>2009-05-12T09:29:52.563-05:00</updated><title type='text'>Bichos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3150/2480983620_c291615b7f_m.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 172px;" src="http://farm4.static.flickr.com/3150/2480983620_c291615b7f_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El algoritmo recursivo tenía un bicho. O sea un error de programación...&lt;br /&gt;Lo que sucedía es que cuando una letra tenía a su alrededor dos veces la letra siguiente de la palabra, solo aceptaba la palabra si se podía construir desde la primera. Mejor, vean esta imágen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1q0Bgb0Z7KI/SgmFPRbpS9I/AAAAAAAAAFE/tvAlNGiVnK0/s1600-h/wordhunt-bug.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_1q0Bgb0Z7KI/SgmFPRbpS9I/AAAAAAAAAFE/tvAlNGiVnK0/s320/wordhunt-bug.png" alt="" id="BLOGGER_PHOTO_ID_5334941731020950482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En este caso, la palabra "LAMI" (si existiera...) sería tomada como válida, pero la palabra "LAMP" no, porque "LAMP" usa la segunda "M" alrededor de la "A". Para corregir el error, fue necesario modificar la función find_word para que quedara así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word, row, column, used&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        matrix &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], [&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],&lt;br /&gt;                  [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],         [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],&lt;br /&gt;                  [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] ]&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; []    &lt;span style='color: #808080'&gt;&lt;i&gt;#fin de la palabra-cerrar recursion&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;2&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; transform &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; matrix:&lt;br /&gt;            new_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; transform[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]&lt;br /&gt;            new_column &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; transform[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt;  new_row &lt;span style='color: #ff00ff'&gt;&amp;gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;and&lt;/span&gt; new_column &lt;span style='color: #ff00ff'&gt;&amp;gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;and&lt;/span&gt; \&lt;br /&gt;                 new_row &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;4&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;and&lt;/span&gt; new_column &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;4&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;and&lt;/span&gt; \&lt;br /&gt;                 used[new_row][new_column] &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;and&lt;/span&gt; \&lt;br /&gt;                 &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[new_row][new_column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[new_row][new_column]] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; letter:&lt;br /&gt;                used_copy &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; used&lt;br /&gt;                used_copy[new_row][new_column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;                new &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_word, new_row, new_column, used_copy&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; new &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]:&lt;br /&gt;                    &lt;b&gt;return&lt;/b&gt; [[new_row, new_column]] &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; new&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ya he hecho un &lt;span style="font-style:italic;"&gt;commit&lt;/span&gt; y un &lt;span style="font-style:italic;"&gt;push&lt;/span&gt; a GIT, así que el archivo completo está aquí:&lt;br /&gt;&lt;a href="http://git.sugarlabs.org/projects/wordhunt/repos/mainline/blobs/raw/e70b6bb86d4abdb34532055e948a3b0560e303e3/wordhunt.py"&gt;http://git.sugarlabs.org/projects/wordhunt/repos/mainline/blobs/raw/e70b6bb86d4abdb34532055e948a3b0560e303e3/wordhunt.py&lt;/a&gt;&lt;br /&gt;Hasta ahora hemos usado python y pygtk, que son requerimientos para hacer una actividad para Sugar, pero aún no es una actividad exclusivamente de Sugar. Lo que llevamos puede correr sin problema en cuaquier sistema que tenga python y pygtk. A partir de la próxima entrada usaremos Sugar (finalmente!).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Imágen:&lt;/span&gt;&lt;br /&gt;e3000: &lt;a href="http://www.flickr.com/photos/e3000/2480983620/"&gt;http://www.flickr.com/photos/e3000/2480983620/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-9153925559924185124?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/9153925559924185124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/05/bichos.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/9153925559924185124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/9153925559924185124'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/05/bichos.html' title='Bichos'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3150/2480983620_c291615b7f_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-2428416606462974982</id><published>2009-05-09T08:10:00.000-05:00</published><updated>2009-05-09T08:10:03.759-05:00</updated><title type='text'>Dando un hogar al código</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1149/656666358_d9cfceeda6_m.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 160px;" src="http://farm2.static.flickr.com/1149/656666358_d9cfceeda6_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;Como dije en la anterior entrada, es la última vez que pongo el código en el blog.&lt;br /&gt;Esto no quiere decir que no habrá más código...&lt;br /&gt;Como el código se está haciendo largo y complejo, se hace necesario partirlo en varios archivos y darles luego un hogar para que vivan su vida de código.&lt;br /&gt;Seguramente se han preguntado por qué he usado variables y escrito los comentarios en inglés, si estoy haciendo esta actividad en español... La razón es que como voy a compartir mi actividad con otros desarrolladores, y es posible que en algún momento tengan que modificar mi actividad, lo más práctico es tenerla en inglés para que la mayoría de los desarrolladores (que hablan casi todos inglés) puedan hacerlo.&lt;br /&gt;&lt;a href="http://www.sugarlabs.org"&gt;SugarLabs&lt;/a&gt; tiene un servicio muy práctico para alojar código, que permite a cualquier persona, de forma muy sencilla alojar su código en los servidores de SugarLabs.&lt;br /&gt;El código de computadores usualmente se aloja no como páginas o texto normal de Internet sino usando un &lt;a href="http://es.wikipedia.org/wiki/Control_de_versiones"&gt;Sistema de control de versiones&lt;/a&gt;, que permite a diferentes personas acceder, modificar y revisar el código, pudiendo ver los cambios históricos que se han hecho a cada archivo. SugarLabs usa un sistema de control de versiones llamado &lt;a href="http://es.wikipedia.org/wiki/Git"&gt;GIT&lt;/a&gt;, y un portal web que hace de interfaz a GIT llamado gitorious.&lt;br /&gt;Las fuentes alojadas en SugarLabs se encuentran en: &lt;a href="http://git.sugarlabs.org/"&gt;http://git.sugarlabs.org/&lt;/a&gt;. Aquí podemos consultar la información sobre proyectos, actividades y desarrolladores. Podemos, por ejemplo, buscar proyectos para ver su estado y podemos visitar el &lt;a href="http://activities.sugarlabs.org/es-ES/sugar/"&gt;portal de actividades&lt;/a&gt; desde el que se pueden bajar actividades para Sugar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Creando nuestro proyecto en SugarLabs&lt;/span&gt;&lt;br /&gt;Un repositorio es un lugar donde podemos alojar nuestras fuentes. Crear nuestro repositorio en SugarLabs es sencillo, pero hay que seguir una serie de pasos. Primero debemos &lt;a href="http://git.sugarlabs.org/users/new"&gt;crear una cuenta en SugarLabs&lt;/a&gt;. Cuando hayamos entrado nuestros datos en el formulario, recibiremos un email de de Gitorious y nuestra cuenta quedará activada cuando sigamos el enlace proporcionado en el email.&lt;br /&gt;Yo ya tengo el mío aquí: &lt;a href="http://git.sugarlabs.org/projects/wordhunt"&gt;Wordhunt&lt;/a&gt;.&lt;br /&gt;Para poder garantizar la seguridad y autenticar la identidad de las personas que modifican el código, es necesario crear unas &lt;a href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica"&gt;llaves de seguridad SSH&lt;/a&gt;. Para esto podemos usar &lt;a href="http://es.wikipedia.org/wiki/OpenSSH"&gt;OpenSSH&lt;/a&gt;. Hay bastantes tutoriales en Internet que explican la creación de llaves como &lt;a href="http://www.bulma.net/body.phtml?nIdNoticia=1722"&gt;este&lt;/a&gt;.&lt;br /&gt;Una vez hemos creado nuestro par de llaves, debemos agregar la llave pública (la llave privada nunca debe salir de nuestras manos!) yendo a &lt;a href="http://git.sugarlabs.org/account"&gt;nuestro perfil dentro de SugarLabs&lt;/a&gt; y seleccionando "Add SSH key".&lt;br /&gt;Una vez tenemos una llave dentro de SugarLabs, ya podemos crear nuestro proyecto. Para hacerlo, vamos a &lt;a href="http://git.sugarlabs.org/"&gt;gitorious&lt;/a&gt; y seleccionamos &lt;a href="http://git.sugarlabs.org/projects"&gt;"Project"&lt;/a&gt; en la barra superior. Este enlace nos lleva a una lista de proyectos. En esta página hay un enlace para &lt;a href="http://git.sugarlabs.org/projects/new"&gt;crear nuevo proyecto&lt;/a&gt;. Aquí damos nombre a nuestro proyecto y otros datos como las categorías, la descripción y la licencia de nuestro proyecto. Cuando pulsemos el botón inferior "Create project", habremos creado un proyecto en SugarLabs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usando GIT&lt;/span&gt;&lt;br /&gt;No haré una introducción ni una explicación de GIT aquí, ya que es largo y complejo, pero si explicaré los pasos que se deben seguir para usar git con los repositorios de SugarLabs. Asumo tambiémn que ya está instalado git (que para distribuciones de GNU/Linux, está en los repositorios oficiales).&lt;br /&gt;Lo primero de debemos hacer es crear una carpeta en nuestro equipo donde tendremos nuestro código fuente. Usando una terminal cambio al directorio de mis fuentes y doy:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git init&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esto prepara mi repositorio local (aunque aún esté vacío...)&lt;br /&gt;Luego conecto mi repositorio local con mi nuevo repositorio remoto con esta línea:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git remote add origin gitorious@git.sugarlabs.org:wordhunt/mainline.git&lt;br /&gt;git push origin master&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturalmente hay que cambiar "wordhunt" por el nombre del proyecto y "gitorious" por nuestro nombre en SugarLabs.&lt;br /&gt;Ya podemos subir las fuentes, así que creamos el archivo wordhunt.py en nuestra carpeta, y para añadirlo al repositorio hacemos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git add wordhunt.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para aprobar nuestros cambios hacemos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git commit -a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que abrirá un editor para que entremos un comentario acerca de los cambios hechos. Y finalmente para empujar nuestros cambios al servidor hacemos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git push&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturalmente usar git es complicado y tiene muchas sutilezas, pero para nuestro sencillo proyecto, lo que debemos hacer cada vez que queramos subir y actualizar nuestras fuentes hacemos un &lt;span style="font-style:italic;"&gt;git add&lt;/span&gt; para los archivos que aún no han sido agregados, luego un &lt;span style="font-style:italic;"&gt;git commit&lt;/span&gt; y un &lt;span style="font-style:italic;"&gt;git push&lt;/span&gt;, que actualizará todos los archivos.&lt;br /&gt;Pueden ver que ya tengo en SugarLabs mi archivo &lt;a href="http://git.sugarlabs.org/projects/wordhunt/repos/mainline/blobs/master/wordhunt.py"&gt;wordhunt.py&lt;/a&gt;. Si quieren poder copiar y pegar a un editor sin los números de línea pueden seguir en esta página el enlace que dice "raw blob data", o sea &lt;a href="http://git.sugarlabs.org/projects/wordhunt/repos/mainline/blobs/raw/d48b46f8b1eb97d6a8914d3a1e52a910e1b6c560/wordhunt.py"&gt;éste&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Imágen:&lt;/span&gt;&lt;br /&gt;Unhindered by Talent: &lt;a href="http://www.flickr.com/photos/nicmcphee/656666358/"&gt;http://www.flickr.com/photos/nicmcphee/656666358/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-2428416606462974982?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/2428416606462974982/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/dando-un-hogar-al-codigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/2428416606462974982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/2428416606462974982'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/dando-un-hogar-al-codigo.html' title='Dando un hogar al código'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1149/656666358_d9cfceeda6_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-9024021223330228027</id><published>2009-05-06T20:59:00.004-05:00</published><updated>2009-05-07T21:01:43.030-05:00</updated><title type='text'>Contando</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3443/3297205226_a12b175d49_m.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://farm4.static.flickr.com/3443/3297205226_a12b175d49_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;Ahora vamos a descongelar el tiempo... Vamos a hacer que el contador se mueva y que el juego termine cuando el tiempo se acabe. Para este tipo de labores, es ideal la función &lt;span style="font-style:italic;"&gt;timeout_add&lt;/span&gt; del módulo &lt;span style="font-style:italic;"&gt;gobject&lt;/span&gt;. Esta función espera cierto tiempo, y luego ejecuta una segunda función, entonces lo que hacemos es definir una función que cuando sea llamada, reste uno del tiempo restante (&lt;span style="font-style:italic;"&gt;remaining_time&lt;/span&gt;), y actualice el tiempo que se muestra en la interfaz. Además, vuelve a crear un contador de tiempo que vuelve a llamar esta función cuando haya pasado un segundo (1000 milisegundos). De esta forma, tendremos un contador. Cuando el tiempo llegue a 0, la casilla de entrada de texto es bloqueada para que no se pueda entrar más palabras.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; update_timer&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;-=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;        timer_text &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #800000'&gt;str&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #800000'&gt;int&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;/&lt;/span&gt; &lt;span style='color: #0000ff'&gt;60&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #dd0000'&gt;":"&lt;/span&gt;&lt;br /&gt;        timer_text &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"%0.2i"&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;%&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;%&lt;/span&gt; &lt;span style='color: #0000ff'&gt;60&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;timer_text&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.set_state&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_INSENSITIVE&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            gobject.timeout_add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1000&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.update_timer&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Además de importar el módulo &lt;span style="font-style:italic;"&gt;gobject&lt;/span&gt; al inicio para poder usar el contador:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; gobject&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;al final de la función __init__ que ya tenemos (llamada el constructor), llamamos una vez la función &lt;span style="font-style:italic;"&gt;update_timer&lt;/span&gt; para que el contador empiece a contar:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.update_timer&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;También voy a aprovechar para ir acumulando las palabras correctas en una lista (&lt;span style="font-style:italic;"&gt;valid_words&lt;/span&gt;), e iré mostrando las palabras que ha entrado el jugador. Esto lo hago cada vez que se entra una palabra válida (dentro de la función &lt;span style="font-style:italic;"&gt;word_entered&lt;/span&gt;). Es importante revisar que la palabra entrada no esté contenida en las palabras váidas que ya tengo, para no incluirla dos veces en la lista.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; word_entered&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word.upper&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;#todo en mayusculas&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"X"&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;print&lt;/b&gt; &lt;span style='color: #dd0000'&gt;"Adiós"&lt;/span&gt;&lt;br /&gt;            gtk.main_quit&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;elif&lt;/b&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt;:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Demasiado Corta"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            word_chain &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_is_valid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;:&lt;br /&gt;                words &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; &lt;span style='color: #ff00ff'&gt;not&lt;/span&gt; word &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words:&lt;br /&gt;                    &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words.append&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;for&lt;/b&gt; valid_word &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words:&lt;br /&gt;                    words &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; valid_word &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #dd0000'&gt;", "&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;words&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.mark_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word_chain&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Inválida"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ah! Además puedo aprovechar para mostrar dónde está ubicada la palabra con la nueva función &lt;span style="font-style:italic;"&gt;mark_word&lt;/span&gt;. Esta función marca en azul las letras que forman la palabra. Lo que debo hacer es recorrer las posiciones de la palabra e ir cambiando el color del gtk.Label de esa posición. Además quiero que dure marcada 5 segundos, pero que luego se desmarque automáticamente. Para esto activo un contador que llame la función &lt;span style="font-style:italic;"&gt;unmark_word&lt;/span&gt; que se encarga de dejar todas las letras negras otra vez. Es importante cancelar el contador de la palabra anterior para garantizar que siempre dura 5 segundos marcada la palabra con la función &lt;span style="font-style:italic;"&gt;source_remove&lt;/span&gt; de &lt;span style="font-style:italic;"&gt;gobject&lt;/span&gt;.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; mark_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, word_chain&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.unmark_word&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; position &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; word_chain:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;60000&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;,&lt;br /&gt;                                position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        gobject.source_remove&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.highlight_timer&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.highlight_timer &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gobject.timeout_add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.unmark_word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La función unmark_word se ve así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; unmark_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;,&lt;br /&gt;                                    row, column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;#to stop timer&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y listo, cada vez se siente más funcional el juego. Como siempre, y por última vez aquí está el código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#! /usr/bin/env python&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# -*- coding: utf-8 -*-&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; gtk&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; gobject&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; pango&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; random&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.Table&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; &lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; size&lt;br /&gt;        gtk.Table.&lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            dice_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                new_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                new_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"sans 32"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;                new_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.attach&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_label, \&lt;br /&gt;                            row, row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, column, column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;br /&gt;                            gtk.EXPAND, gtk.EXPAND&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                dice_row &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [new_label]&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [dice_row]&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; set_dice&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, text, row, column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels[row][column].set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;text&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; set_color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, color, row, column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels[row][column].modify_fg&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_NORMAL, color&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhunt&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;:&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; &lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;: &lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [ [&lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"P"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"F"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"F"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"K"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"M"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"B"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"J"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"B"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Z"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"P"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"C"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Y"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"V"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"D"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"M"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"C"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"X"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"D"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"W"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"V"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Y"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"D"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"W"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"G"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Y"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"W"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"G"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;] ]&lt;br /&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.face &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [ [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;] ]&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [ [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;] ]&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.new_shuffled_group&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.new_dice_set&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.highlight_timer &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;91&lt;/span&gt;  &lt;span style='color: #808080'&gt;&lt;i&gt;#always one second more than needed&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        mainwindow &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Window&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.WINDOW_TOPLEVEL&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        mainwindow.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;640&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;480&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        mainwindow.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"delete_event"&lt;/span&gt;, gtk.main_quit&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box1 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.HBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box1.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        mainwindow.add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box1&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box2 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Left side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        box2.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box2&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box3 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Right side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        box3.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box3&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;# Create dice grid&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;250&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;250&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_dice&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;br /&gt;                  &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column]],&lt;br /&gt;                  row,column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;# Create text entry line&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Entry&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"activate"&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.entry_activate_callback&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;# Create timer display&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"1:00"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"mono 24"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;90&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label.modify_fg&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_NORMAL, gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;60000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;#Create Player Panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_line_wrap&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;True&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;140&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;100&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;#Create dummy Definitions panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        definition_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        definition_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;definition_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        mainwindow.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.update_timer&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; new_dice_set&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        available_dice &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;16&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; random.randint&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;available_dice&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                available_dice.pop&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; new_shuffled_group&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; random.randint&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;5&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word, index&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        internal_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;br /&gt;        real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;while&lt;/b&gt; internal_index &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; index:&lt;br /&gt;            letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Q"&lt;/span&gt;:&lt;br /&gt;                real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; real_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; real_index &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                    letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;                &lt;b&gt;elif&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;:&lt;br /&gt;                    &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;br /&gt;            real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; real_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;            internal_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; internal_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;        result &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; result &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Q"&lt;/span&gt;:&lt;br /&gt;            real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; real_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; real_index &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                result &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; result &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"u"&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; result&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; start_positions&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,letter&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        positions &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column]] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; letter:&lt;br /&gt;                    positions.append&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;[row, column]&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; positions&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word, row, column, used&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        matrix &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], [&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],&lt;br /&gt;                  [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],         [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],&lt;br /&gt;                  [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] ]&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; []    &lt;span style='color: #808080'&gt;&lt;i&gt;#fin de la palabra-cerrar recursion&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;2&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; transform &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; matrix:&lt;br /&gt;            new_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; transform[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]&lt;br /&gt;            new_column &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; transform[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt;  new_row &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; new_column &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; \&lt;br /&gt;                 new_row &lt;span style='color: #ff00ff'&gt;&amp;gt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; new_column &lt;span style='color: #ff00ff'&gt;&amp;gt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; \&lt;br /&gt;                 used[new_row][new_column] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:&lt;br /&gt;                &lt;b&gt;pass&lt;/b&gt;&lt;br /&gt;            &lt;b&gt;elif&lt;/b&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[new_row][new_column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[new_row][new_column]] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; letter:&lt;br /&gt;                used_copy &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; used&lt;br /&gt;                used_copy[new_row][new_column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;return&lt;/b&gt; [[new_row, new_column]] &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; \&lt;br /&gt;                    &lt;span style='color: #008000'&gt;self&lt;/span&gt;.find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_word, new_row, new_column, used_copy&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; word_is_valid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;        &lt;b&gt;elif&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;2&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; position &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.start_positions&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;letter&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            used &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]]&lt;br /&gt;            used[position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]][position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;            used_copy &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; used&lt;br /&gt;            word_chain &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;],position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]]] &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; \&lt;br /&gt;                  &lt;span style='color: #008000'&gt;self&lt;/span&gt;.find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_word, position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], used_copy&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;:&lt;br /&gt;                &lt;b&gt;return&lt;/b&gt; word_chain&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; word_entered&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word.upper&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;#todo en mayusculas&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"X"&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;print&lt;/b&gt; &lt;span style='color: #dd0000'&gt;"Adiós"&lt;/span&gt;&lt;br /&gt;            gtk.main_quit&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;elif&lt;/b&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt;:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Demasiado Corta"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            word_chain &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_is_valid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;:&lt;br /&gt;                words &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; &lt;span style='color: #ff00ff'&gt;not&lt;/span&gt; word &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words:&lt;br /&gt;                    &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words.append&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;for&lt;/b&gt; valid_word &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.valid_words:&lt;br /&gt;                    words &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; valid_word &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #dd0000'&gt;", "&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;words&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.mark_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word_chain&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Inválida"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; entry_activate_callback&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,widget&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entered&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.get_text&lt;span style='color: #ff00ff'&gt;())&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; mark_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, word_chain&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.unmark_word&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; position &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; word_chain:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;60000&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;,&lt;br /&gt;                                position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        gobject.source_remove&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.highlight_timer&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.highlight_timer &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gobject.timeout_add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.unmark_word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; unmark_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;,&lt;br /&gt;                                    row, column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;#to stop timer&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; update_timer&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;-=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;        timer_text &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #800000'&gt;str&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #800000'&gt;int&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;/&lt;/span&gt; &lt;span style='color: #0000ff'&gt;60&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #dd0000'&gt;":"&lt;/span&gt;&lt;br /&gt;        timer_text &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"%0.2i"&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;%&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;%&lt;/span&gt; &lt;span style='color: #0000ff'&gt;60&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.timer_label.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;timer_text&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.remaining_time &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.set_state&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_INSENSITIVE&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            gobject.timeout_add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1000&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.update_timer&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;wh &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; wordhunt&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;gtk.main&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Imágen:&lt;/span&gt;&lt;br /&gt;wwarby: &lt;a href="http://www.flickr.com/photos/wwarby/3297205226/"&gt;http://www.flickr.com/photos/wwarby/3297205226/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-9024021223330228027?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/9024021223330228027/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/05/contando.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/9024021223330228027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/9024021223330228027'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/05/contando.html' title='Contando'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3443/3297205226_a12b175d49_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-9025724694711924955</id><published>2009-05-03T11:01:00.012-05:00</published><updated>2009-05-03T21:27:20.833-05:00</updated><title type='text'>Mezclando</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3244/3156850244_9294f66340_m.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 160px;" src="http://farm4.static.flickr.com/3244/3156850244_9294f66340_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vamos ahora a mezclar los ingredientes que tenemos. Por un lado habíamos construido el motor del juego, que puede generar la matriz de dados aleatoriamente, y que puede recibir las palabras escritas por el jugador para verificar si se pueden construir con los dados disponibles. De este ingrediente, ya no necesitaremos la función que imprime en la terminal la cuadrícula, ni la entrada de texto desde la terminal, porque esto será ahora el trabajo de nuestro segundo ingrediente. Nuestro segundo ingrediente fue la interfaz gráfica, que nos puede mostrar la cuadrícula, además de tener un espacio para entrar texto. Vamos a agregar un par de cosas a la clase &lt;span style="font-style: italic;"&gt;worhuntgrid&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.Table&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; &lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; size&lt;br /&gt;        gtk.Table.&lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            dice_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                new_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                new_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"sans 32"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;                new_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.attach&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_label, \&lt;br /&gt;                            row, row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, column, column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;br /&gt;                            gtk.EXPAND, gtk.EXPAND&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                dice_row &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [new_label]&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [dice_row]&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; set_dice&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, text, row, column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels[row][column].set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;text&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/73/163202136_14ead879f5_m.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 180px;" src="http://farm1.static.flickr.com/73/163202136_14ead879f5_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;En primer lugar, agrego la opción de determinar el tamaño de la cuadrícula cuando se cree el objeto, por eso ahora el constructor (&lt;span style="font-style: italic;"&gt;__init__&lt;/span&gt;) toma un valor de entrada. Este valor se guarda en la variable&lt;span style="font-style: italic;"&gt; self.size&lt;/span&gt;. El objeto &lt;span style="font-style: italic;"&gt;self&lt;/span&gt; representa al objeto mismo en el que estamos, así que &lt;span style="font-style: italic;"&gt;self.size&lt;/span&gt; es la variable &lt;span style="font-style: italic;"&gt;size&lt;/span&gt; que pertence al objeto. No es la misma &lt;span style="font-style: italic;"&gt;size&lt;/span&gt; que entró al objeto. Además he agregado una función &lt;span style="font-style: italic;"&gt;set_dice&lt;/span&gt;, que permite dar una letra (&lt;span style="font-style: italic;"&gt;text&lt;/span&gt;) y su ubicación para colocarla en la cuadrícula.&lt;br /&gt;&lt;br /&gt;Y ahora si a mezclar...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/135/348629926_2c06a187fb_m.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 160px;" src="http://farm1.static.flickr.com/135/348629926_2c06a187fb_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;Para combinar el motor del programa con su interfaz gráfica, voy a crear una clase llamada &lt;span style="font-style: italic;"&gt;wordhunt&lt;/span&gt;. Esta clase contendrá elementos de ambos, muchas veces colocando &lt;span style="font-style: italic;"&gt;self&lt;/span&gt; como prefijo a algunas variables, para que éstas estén disponibles para el resto de funciones de la clase. Naturalmente cuando las use, debo usar también el prefijo &lt;span style="font-style: italic;"&gt;self&lt;/span&gt;.&lt;br /&gt;Para pasar las letras de los dados que se generaron aleatoriamente, debo usar la función &lt;span style="font-style:italic;"&gt;set_dice&lt;/span&gt; que mostré arriba de esta forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_dice&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;br /&gt;                  &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column]],&lt;br /&gt;                  row,column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3038/3004553146_ca0630ff1a_m.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 180px;" src="http://farm4.static.flickr.com/3038/3004553146_ca0630ff1a_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;Para recibir la entrada de texto, debo monitorear el momento en que se ha hecho "Enter" en la entrada de texto. Muchos objetos en GTK generan "señales" cuando ocurre algo con ellos. Un objeto &lt;span style="font-style:italic;"&gt;gtk.Entry&lt;/span&gt; genera una señal "activate" cuando se presiona "Enter" estando el cursor en él. Lo que debemos hacer es conectar esta señal a una función (&lt;span style="font-style:italic;"&gt;entry_activate_callback&lt;/span&gt;), que será llamada cada vez que la señal se genere, así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"activate"&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.entry_activate_callback&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La función que se llama con activate la defino así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; entry_activate_callback&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,widget&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entered&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.get_text&lt;span style='color: #ff00ff'&gt;())&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esta función llama a una segunda función (&lt;span style="font-style:italic;"&gt;word_entered&lt;/span&gt;), pasándole el contenido de la entrada de texto, y luego limpia la entrada de texto. Además, en vez de usar print como antes para reportar si una palabra es válida, pongo el texto en el &lt;span style="font-style:italic;"&gt;gtk.Label&lt;/span&gt; &lt;span style="font-style:italic;"&gt;player_panel&lt;/span&gt;. De esta forma el texto se muestra justo debajo del contador de tiempo. La función &lt;span style="font-style:italic;"&gt;word_entered&lt;/span&gt; queda así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#! /usr/bin/env python&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# -*- coding: utf-8 -*-&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; gtk&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; pango&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; random&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.Table&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; &lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; size&lt;br /&gt;        gtk.Table.&lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            dice_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                new_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                new_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"sans 32"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;                new_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.attach&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_label, \&lt;br /&gt;                            row, row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, column, column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;br /&gt;                            gtk.EXPAND, gtk.EXPAND&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                dice_row &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [new_label]&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [dice_row]&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; set_dice&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, text, row, column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels[row][column].set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;text&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhunt&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;:&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; &lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;: &lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [ [&lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"P"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"F"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"F"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"K"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"M"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"B"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"J"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"B"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Z"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"P"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"C"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Y"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"V"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"D"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"M"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"C"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"X"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"D"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"W"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"V"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Y"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"D"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"W"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"G"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"H"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"R"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"Y"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"L"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"W"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"O"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"T"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"G"&lt;/span&gt;],&lt;br /&gt;                 [&lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"I"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"N"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"E"&lt;/span&gt;, &lt;span style='color: #dd0000'&gt;"S"&lt;/span&gt;] ]&lt;br /&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.face &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [ [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;] ]&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [ [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;] ]&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.new_shuffled_group&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.new_dice_set&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        mainwindow &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Window&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.WINDOW_TOPLEVEL&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        mainwindow.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"delete_event"&lt;/span&gt;, gtk.main_quit&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box1 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.HBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box1.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        mainwindow.add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box1&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box2 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Left side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        box2.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box2&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        box3 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Right side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        box3.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box3&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;# Create dice grid&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;250&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;250&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.set_dice&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;br /&gt;                  &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column]],&lt;br /&gt;                  row,column&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.grid&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;# Create text entry line&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Entry&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"activate"&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.entry_activate_callback&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;# Create timer display&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        timer_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"1:00"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        timer_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"mono 24"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;        timer_label.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;90&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        timer_label.modify_fg&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_NORMAL, gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;60000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;        timer_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;timer_label&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;#Create Player Panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #808080'&gt;&lt;i&gt;#Create dummy Definitions panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        definition_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        definition_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;definition_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        mainwindow.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; new_dice_set&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        available_dice &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;16&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; random.randint&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;available_dice&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                available_dice.pop&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; new_shuffled_group&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; random.randint&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;5&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word, index&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        internal_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;br /&gt;        real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;while&lt;/b&gt; internal_index &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; index:&lt;br /&gt;            letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Q"&lt;/span&gt;:&lt;br /&gt;                real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; real_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; real_index &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                    letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;                &lt;b&gt;elif&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"U"&lt;/span&gt;:&lt;br /&gt;                    &lt;b&gt;return&lt;/b&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;br /&gt;            real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; real_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;            internal_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; internal_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;        result &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; result &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Q"&lt;/span&gt;:&lt;br /&gt;            real_index &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; real_index &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; real_index &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                result &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; result &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"u"&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; result&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; start_positions&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,letter&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        positions &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                &lt;b&gt;if&lt;/b&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[row][column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[row][column]] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; letter:&lt;br /&gt;                    positions.append&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;[row, column]&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; positions&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word, row, column, used&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        matrix &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], [&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],&lt;br /&gt;                  [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],         [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;],&lt;br /&gt;                  [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] ]&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; []    &lt;span style='color: #808080'&gt;&lt;i&gt;#fin de la palabra-cerrar recursion&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;2&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; transform &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; matrix:&lt;br /&gt;            new_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; transform[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]&lt;br /&gt;            new_column &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; transform[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt;  new_row &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; new_column &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;0&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; \&lt;br /&gt;                 new_row &lt;span style='color: #ff00ff'&gt;&amp;gt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; new_column &lt;span style='color: #ff00ff'&gt;&amp;gt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;or&lt;/span&gt; \&lt;br /&gt;                 used[new_row][new_column] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:&lt;br /&gt;                &lt;b&gt;pass&lt;/b&gt;&lt;br /&gt;            &lt;b&gt;elif&lt;/b&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice[&lt;span style='color: #008000'&gt;self&lt;/span&gt;.facedie[new_row][new_column]][&lt;span style='color: #008000'&gt;self&lt;/span&gt;.face[new_row][new_column]] &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; letter:&lt;br /&gt;                used_copy &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; used&lt;br /&gt;                used_copy[new_row][new_column] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;return&lt;/b&gt; [[new_row, new_column]] &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; \&lt;br /&gt;                    &lt;span style='color: #008000'&gt;self&lt;/span&gt;.find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_word, new_row, new_column, used_copy&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; word_is_valid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        letter &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.get_letter&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;""&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;        &lt;b&gt;elif&lt;/b&gt; letter &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;2&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            new_word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;:]&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; position &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.start_positions&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;letter&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            used &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], [&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;,&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]]&lt;br /&gt;            used[position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;]][position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]] &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;&lt;br /&gt;            used_copy &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; used&lt;br /&gt;            word_chain &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; [[position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;],position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;]]] &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; \&lt;br /&gt;                  &lt;span style='color: #008000'&gt;self&lt;/span&gt;.find_word&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_word, position[&lt;span style='color: #0000ff'&gt;0&lt;/span&gt;], position[&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;], used_copy&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;:&lt;br /&gt;                &lt;b&gt;return&lt;/b&gt; word_chain&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt; [&lt;span style='color: #008000'&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; word_entered&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        word &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; word.upper&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;#todo en mayusculas&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;if&lt;/b&gt; word &lt;span style='color: #ff00ff'&gt;==&lt;/span&gt; &lt;span style='color: #dd0000'&gt;"X"&lt;/span&gt;:&lt;br /&gt;            &lt;b&gt;print&lt;/b&gt; &lt;span style='color: #dd0000'&gt;"Adiós"&lt;/span&gt;&lt;br /&gt;            gtk.main_quit&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;elif&lt;/b&gt; &lt;span style='color: #800000'&gt;len&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt; &lt;span style='color: #ff00ff'&gt;&amp;lt;&lt;/span&gt; &lt;span style='color: #0000ff'&gt;3&lt;/span&gt;:&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Demasiado Corta"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;            word_chain &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_is_valid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style='color: #ff00ff'&gt;-&lt;/span&gt;&lt;span style='color: #0000ff'&gt;1&lt;/span&gt;] &lt;span style='color: #ff00ff'&gt;!=&lt;/span&gt; &lt;span style='color: #008000'&gt;False&lt;/span&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Válida"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;b&gt;print&lt;/b&gt; word_chain&lt;br /&gt;            &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.player_panel.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"Inválida"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; entry_activate_callback&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;,widget&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entered&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.get_text&lt;span style='color: #ff00ff'&gt;())&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.word_entry.set_text&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;""&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;b&gt;return&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;wh &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; wordhunt&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;gtk.main&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Imágenes:&lt;br /&gt;&lt;br /&gt;vivere libero: &lt;a href="http://www.flickr.com/photos/viverelibero/3004553146/"&gt;http://www.flickr.com/photos/viverelibero/3004553146/&lt;/a&gt;&lt;br /&gt;sylvar: &lt;a href="http://www.flickr.com/photos/sylvar/348629926/"&gt;http://www.flickr.com/photos/sylvar/348629926/&lt;/a&gt;&lt;br /&gt;ginnerobot: &lt;a href="http://www.flickr.com/photos/ginnerobot/3156850244/"&gt;http://www.flickr.com/photos/ginnerobot/3156850244/&lt;/a&gt;&lt;br /&gt;_e.t: &lt;a href="http://www.flickr.com/photos/45688285@N00/82172576/"&gt;http://www.flickr.com/photos&lt;br /&gt;/45688285@N00/82172576/&lt;/a&gt;&lt;br /&gt;mknobil: &lt;a href="http://www.flickr.com/photos/knobil/163202136/"&gt;http://www.flickr.com/photos/knobil/163202136/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-9025724694711924955?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/9025724694711924955/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/05/mezclando.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/9025724694711924955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/9025724694711924955'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/05/mezclando.html' title='Mezclando'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3244/3156850244_9294f66340_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-1578175011867443917</id><published>2009-04-30T22:59:00.007-05:00</published><updated>2009-05-02T11:01:51.340-05:00</updated><title type='text'>Iniciando la interfaz gráfica (Parte 2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/60/210573715_e425d7b752.jpg?v=1163298190"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 338px; height: 224px;" src="http://farm1.static.flickr.com/60/210573715_e425d7b752.jpg?v=1163298190" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En este artículo, agregaré un par de nuevos elementos a la interfaz para dejarla prácticamente completa. Hay que tener en cuenta que aún no he entrado en Sugar, estoy usando aún sólo GTK. Esto tiene la ventaja de que aún podemos correr el programa en equipos sin Sugar, pero aún no tenemos funcionalidad de sugar como la barra superior de la actividad o la posibilidad de integrar nuestra aplicación con el Diario de Sugar.&lt;br /&gt;En la entrada anteriror, mostré cómo hacer la cuadrícula de letras y cómo ponerla dentro de una ventana GTK. Ahora que voy a colocar otros elementos como el contador y la entrada de texto, es necesario usar "Contenedores" de GTK. Los contenedores son "objetos" que me permiten colocar otros "objetos" dentro de ellos. Como en una repisa, puedo tener varias divisiones para poner elementos. Para construir la interfaz, usaré los contenedores &lt;span style="font-style: italic;"&gt;gtk.VBox&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;gtk.HBox&lt;/span&gt; que son contenedores con espacios alineados vertical u horizontalmente respectivamente.&lt;br /&gt;Primero usaré un &lt;span style="font-style: italic;"&gt;HBox&lt;/span&gt; para partir la ventana en dos partes. En la izquierda voy a tener los dados y la línea de entrada de texto, y en la derecha, tendré el contador y la información de las palabras. El &lt;span style="font-style: italic;"&gt;HBox&lt;/span&gt; me crea un contenedor (que llamo &lt;span style="font-style: italic;"&gt;box1&lt;/span&gt;) con elementos alineados uno al lado del otro. Luego con un VBox (que llamo &lt;span style="font-style: italic;"&gt;box2&lt;/span&gt;) que colocaré dentro del HBox (usando la función &lt;span style="font-style: italic;"&gt;pack_start&lt;/span&gt;), podré colocar la cuadrícula sobre la entrada de texto:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mainwindow &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Window&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.WINDOW_TOPLEVEL&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;mainwindow.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"delete_event"&lt;/span&gt;, gtk.main_quit&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;box1 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.HBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box1.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box1&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;box2 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Left side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;box2.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box2&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;box3 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Right side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;box3.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box3&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Create dice grid&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;grid &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;grid.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;250&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;250&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;grid.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;grid&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Create text entry line&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;word_entry &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Entry&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;word_entry.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word_entry&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finalmente en otra caja vertical (&lt;span style="font-style: italic;"&gt;box3&lt;/span&gt;), pondré el contador y otros dos elementos de texto vacíos de los que me encargaré en otra ocasión:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Create timer display&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;timer_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"1:00"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;timer_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"mono 24"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;timer_label.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;90&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;timer_label.modify_fg&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_NORMAL, gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;60000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;timer_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;timer_label&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#Create dummy Player Panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;player_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;player_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;player_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#Create dummy Definitions panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;definition_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;definition_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;definition_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;mainwindow.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;gtk.main&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con este sencillo código ya tengo una ventana que se ve así en Ubuntu (Gnome):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1q0Bgb0Z7KI/SfxYENCJ6aI/AAAAAAAAAEk/QlvkhW1jXyE/s1600-h/Pantallazo-wordhuntwindow.py.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 275px;" src="http://4.bp.blogspot.com/_1q0Bgb0Z7KI/SfxYENCJ6aI/AAAAAAAAAEk/QlvkhW1jXyE/s400/Pantallazo-wordhuntwindow.py.png" alt="" id="BLOGGER_PHOTO_ID_5331232888141244834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y así en Sugar:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1q0Bgb0Z7KI/SfxX2W8ZkfI/AAAAAAAAAEc/Hfx_rK8m7_M/s1600-h/ss.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_1q0Bgb0Z7KI/SfxX2W8ZkfI/AAAAAAAAAEc/Hfx_rK8m7_M/s400/ss.png" alt="" id="BLOGGER_PHOTO_ID_5331232650283291122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y como es usual, el código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#! /usr/bin/env python&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# -*- coding: utf-8 -*-&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# GTK es la librería gráfica usada por Sugar&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; gtk&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Pango es una librería para el dibujo de texto internacional&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #ff00ff'&gt;import&lt;/span&gt; pango&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.Table&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;    &lt;b&gt;def&lt;/b&gt; &lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; &lt;span style='color: #0000ff'&gt;4&lt;/span&gt;&lt;br /&gt;        gtk.Table.&lt;span style='color: #000e52'&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size, &lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;        &lt;b&gt;for&lt;/b&gt; row &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;            dice_row &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; []&lt;br /&gt;            &lt;b&gt;for&lt;/b&gt; column &lt;span style='color: #ff00ff'&gt;in&lt;/span&gt; &lt;span style='color: #800000'&gt;range&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #008000'&gt;self&lt;/span&gt;.size&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;:&lt;br /&gt;                new_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"A"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                new_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"sans 32"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;                new_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;                &lt;span style='color: #008000'&gt;self&lt;/span&gt;.attach&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;new_label, \&lt;br /&gt;                            row, row &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;, column, column &lt;span style='color: #ff00ff'&gt;+&lt;/span&gt; &lt;span style='color: #0000ff'&gt;1&lt;/span&gt;,&lt;br /&gt;                            gtk.EXPAND, gtk.EXPAND&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;                dice_row &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [new_label]&lt;br /&gt;            &lt;span style='color: #008000'&gt;self&lt;/span&gt;.dice_labels &lt;span style='color: #ff00ff'&gt;+=&lt;/span&gt; [dice_row]&lt;br /&gt;&lt;br /&gt;mainwindow &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Window&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.WINDOW_TOPLEVEL&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;mainwindow.&lt;span style='color: #0095ff'&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"delete_event"&lt;/span&gt;, gtk.main_quit&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;box1 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.HBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box1.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.add&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box1&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;box2 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Left side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;box2.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box2&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;box3 &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.VBox&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt; &lt;span style='color: #808080'&gt;&lt;i&gt;# Right side panels&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;box3.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box1.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;box3&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Create dice grid&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;grid &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; wordhuntgrid&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;grid.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;250&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;250&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;grid.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;grid&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Create text entry line&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;word_entry &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Entry&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;word_entry.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box2.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;word_entry&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;# Create timer display&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;timer_label &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"1:00"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;timer_label.modify_font&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;pango.FontDescription&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;"mono 24"&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;timer_label.set_size_request&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;100&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;90&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;timer_label.modify_fg&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;gtk.STATE_NORMAL, gtk.gdk.Color&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #0000ff'&gt;60000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;, &lt;span style='color: #0000ff'&gt;5000&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;))&lt;/span&gt;&lt;br /&gt;timer_label.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;timer_label&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#Create dummy Player Panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;player_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;player_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;player_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #808080'&gt;&lt;i&gt;#Create dummy Definitions panel&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;definition_panel &lt;span style='color: #ff00ff'&gt;=&lt;/span&gt; gtk.Label&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;&lt;span style='color: #dd0000'&gt;" "&lt;/span&gt;&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;definition_panel.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;box3.pack_start&lt;span style='color: #ff00ff'&gt;(&lt;/span&gt;definition_panel&lt;span style='color: #ff00ff'&gt;)&lt;/span&gt;&lt;br /&gt;mainwindow.show&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;gtk.main&lt;span style='color: #ff00ff'&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Imágen:&lt;/span&gt;&lt;br /&gt;mark sebastian: &lt;a href="http://www.flickr.com/photos/markjsebastian/210573715/"&gt;http://www.flickr.com/photos/markjsebastian/210573715/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-1578175011867443917?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/1578175011867443917/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/iniciando-la-interfaz-grafica-parte-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/1578175011867443917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/1578175011867443917'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/iniciando-la-interfaz-grafica-parte-2.html' title='Iniciando la interfaz gráfica (Parte 2)'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_1q0Bgb0Z7KI/SfxYENCJ6aI/AAAAAAAAAEk/QlvkhW1jXyE/s72-c/Pantallazo-wordhuntwindow.py.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-7876928632815708958</id><published>2009-04-28T21:43:00.016-05:00</published><updated>2009-04-30T21:27:07.928-05:00</updated><title type='text'>Iniciando la interfaz gráfica (Parte 1)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2265/2361897135_204b0b70b1.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 383px; height: 253px;" src="http://farm3.static.flickr.com/2265/2361897135_204b0b70b1.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ya tenemos una parte del motor interno de nuestro juego. Ahora, debemos presentar nuestro juego dentro de una ventana propia con todos los elementos necesarios visibles. Las ventanas además de presentar información, son el tablero de control de nuestro juego.&lt;br /&gt;Como eso de usar ventanas, botones y menus es tan común, los programadores no tenemos que hacer todo el trabajo. Existen muchas herramientas libres (y que además pueden usarse desde de Python) para esto. Sugar en particular usa la biblioteca &lt;a href="http://es.wikipedia.org/wiki/GTK%2B"&gt;GTK&lt;/a&gt;, así que empezaremos a construir nuestra interfaz gráfica con ella. Para esto es necesario importar en python el módulo gtk:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; gtk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Además voy a usar &lt;a href="http://www.pango.org/"&gt;Pango&lt;/a&gt;, que se encarga del formato y dibujo del texto. Por ahora solo lo usaré para cambiar de tamaño mis letras. Debo cargar el módulo pango con:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; pango&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Antes de empezar a escribir código, he hecho un simple boceto de lo que quiero tener:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1q0Bgb0Z7KI/Sfn97P5NvNI/AAAAAAAAAEU/80uGkEr3Gd4/s1600-h/Wordhunt-gui-sk.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 261px;" src="http://1.bp.blogspot.com/_1q0Bgb0Z7KI/Sfn97P5NvNI/AAAAAAAAAEU/80uGkEr3Gd4/s400/Wordhunt-gui-sk.png" alt="" id="BLOGGER_PHOTO_ID_5330570828290309330" border="0" /&gt;&lt;/a&gt;En este dibujo se ve la cuadrícula de los dados en la izquierda y una línea de entrada de texto debajo de ésta. En la derecha de la interfaz gráfica, tendremos el tiempo de juego, las palabras entradas por los jugadores (cuando logremos llegar a compartir la actividad), y abajo un panel para mostrar la definición de la palabra seleccionada (posiblemente traída de internet para no tener que empacar un diccionario completo con nuestro juego).&lt;br /&gt;Además, en la barra superior habrá dos pestañas, una de "Actividad", que permite iniciar el juego, y determinar el tiempo de juego, y otra pestaña que permite ver los puntajes.&lt;br /&gt;En esta entrada simplemente vamos a crear la cuadrícula de los dados.&lt;br /&gt;Para hacer esta cuadrícula, voy a crear una &lt;a href="http://es.wikipedia.org/wiki/Clase_%28inform%C3%A1tica%29"&gt;clase&lt;/a&gt; que &lt;a href="http://es.wikipedia.org/wiki/Herencia_%28programaci%C3%B3n_orientada_a_objetos%29"&gt;hereda&lt;/a&gt; la clase &lt;a href="http://www.pygtk.org/pygtk2reference/class-gtktable.html"&gt;&lt;span style="font-style: italic;"&gt;gtk.Table&lt;/span&gt;&lt;/a&gt;. Es decir es una tabla, con algunas características adicionales.&lt;br /&gt;En cada una de las 16 casillas coloco (con la función &lt;span style="font-style: italic;"&gt;attach&lt;/span&gt;) un &lt;a href="http://www.pygtk.org/pygtk2reference/class-gtklabel.html"&gt;&lt;span style="font-style: italic;"&gt;gtk.Label&lt;/span&gt;&lt;/a&gt; que mostrará la letra (por ahora solo una "A"), y los guardaré en una lista (&lt;span style="font-style: italic;"&gt;dice_labels&lt;/span&gt;) para poder manipuarlos después.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;# GTK es la librería gráfica usada por Sugar&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; gtk&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;# Pango es una librería para el dibujo de texto internacional&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; pango&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhuntgrid&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;gtk.Table&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;   &lt;b&gt;def&lt;/b&gt; &lt;span style="color: rgb(0, 14, 82);"&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;       &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;br /&gt;       gtk.Table.&lt;span style="color: rgb(0, 14, 82);"&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.dice_labels &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; []&lt;br /&gt;       &lt;b&gt;for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;           dice_row &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; []&lt;br /&gt;           &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;               new_label &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; gtk.Label&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;               new_label.modify_font&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;pango.FontDescription&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"sans 32"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;))&lt;/span&gt;&lt;br /&gt;               new_label.show&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;               &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.attach&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;new_label, \&lt;br /&gt;                           row, row &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, column, column &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;,&lt;br /&gt;                           gtk.EXPAND, gtk.EXPAND&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;               dice_row &lt;span style="color: rgb(255, 0, 255);"&gt;+=&lt;/span&gt; [new_label]&lt;br /&gt;           &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.dice_labels &lt;span style="color: rgb(255, 0, 255);"&gt;+=&lt;/span&gt; [dice_row]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hemos creado aquí una clase que puede mostrarse, pero hasta que no la instanciemos, es un cascarón vacío...&lt;br /&gt;Lo que haremos es crear una ventana (&lt;span style="font-style: italic;"&gt;mainwindow&lt;/span&gt;) y luego agregamos nuestra cuadrícula (guardada en la variable &lt;span style="font-style: italic;"&gt;grid&lt;/span&gt;)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mainwindow &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; gtk.Window&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;gtk.WINDOW_TOPLEVEL&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;grid &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; wordhuntgrid&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.add&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;grid&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;grid.set_size_request&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;250&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;250&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;grid.show&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.show&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.&lt;span style="color: rgb(0, 149, 255);"&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"delete_event"&lt;/span&gt;, gtk.main_quit&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;gtk.main&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta parte eventualmente cambiará radicalmente, pero por ahora es útil para ver cómo funciona nuestra cuadrícula.&lt;br /&gt;En Sugar todas las ventanas ocupan la pantalla completa y no tienen borde por defecto, por eso para cerrar el programa, es necesario usar las teclas "Alt"+ "Esc" al mismo tiempo (el "Esc" en una máquina XO es la X en la esquina superior izquierda).&lt;br /&gt;Y ahora como siempre al final el código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;# GTK es la librería gráfica usada por Sugar&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; gtk&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;# Pango es una librería para el dibujo de texto internacional&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; pango&lt;br /&gt;&lt;br /&gt;&lt;b&gt;class&lt;/b&gt; wordhuntgrid&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;gtk.Table&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;   &lt;b&gt;def&lt;/b&gt; &lt;span style="color: rgb(0, 14, 82);"&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;       &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;br /&gt;       gtk.Table.&lt;span style="color: rgb(0, 14, 82);"&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.dice_labels &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; []&lt;br /&gt;       &lt;b&gt;for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;           dice_row &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; []&lt;br /&gt;           &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.size&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;               new_label &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; gtk.Label&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;               new_label.modify_font&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;pango.FontDescription&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"sans 32"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;))&lt;/span&gt;&lt;br /&gt;               new_label.show&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;               &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.attach&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;new_label, \&lt;br /&gt;                           row, row &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, column, column &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;,&lt;br /&gt;                           gtk.EXPAND, gtk.EXPAND&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;               dice_row &lt;span style="color: rgb(255, 0, 255);"&gt;+=&lt;/span&gt; [new_label]&lt;br /&gt;           &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;.dice_labels &lt;span style="color: rgb(255, 0, 255);"&gt;+=&lt;/span&gt; [dice_row]&lt;br /&gt;&lt;br /&gt;mainwindow &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; gtk.Window&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;gtk.WINDOW_TOPLEVEL&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;grid &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; wordhuntgrid&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.add&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;grid&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;grid.set_size_request&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;250&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;250&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;grid.show&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.show&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;mainwindow.&lt;span style="color: rgb(0, 149, 255);"&gt;&lt;b&gt;connect&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"delete_event"&lt;/span&gt;, gtk.main_quit&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;gtk.main&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enlaces&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wiki.laptop.org/go/PyGTK/Hello_World_Tutorial"&gt;Tutorial de pygtk&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Imágenes&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;internets diary:&lt;a href="http://http//www.flickr.com/photos/16339684@N00/2361897135/"&gt;http://www.flickr.com/photos/16339684@N00/2361897135/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-7876928632815708958?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/7876928632815708958/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/iniciando-la-interfaz-grafica-parte-1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/7876928632815708958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/7876928632815708958'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/iniciando-la-interfaz-grafica-parte-1.html' title='Iniciando la interfaz gráfica (Parte 1)'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1q0Bgb0Z7KI/Sfn97P5NvNI/AAAAAAAAAEU/80uGkEr3Gd4/s72-c/Wordhunt-gui-sk.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-3332722698483458458</id><published>2009-04-27T21:59:00.012-05:00</published><updated>2009-04-28T09:30:12.096-05:00</updated><title type='text'>Recibiendo palabras (Parte 2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3378/3318600273_3ef4c48d0a.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 384px; height: 309px;" src="http://farm4.static.flickr.com/3378/3318600273_3ef4c48d0a.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;Ahora que podemos recibir las palabras entradas por el jugador, el computador debe revisar si la palabra se puede construir con las letras disponibles. ¡Este tipo de cálculos son la razón de existir de los computadores!&lt;br /&gt;Para averiguar si una palabra se encuentra, tenemos que revisar primero si la primera letra está disponible. Además, debemos tratar de formar la palabra a partir de cada aparición de la letra, es decir debemos repetir el proceso para cada vez que la letra se encuentre. Para esto se escribí la  función &lt;span style="font-style: italic;"&gt;start_positions&lt;/span&gt;, que busca entre los dados las ubicaciones de la letra, y entrega la lista de coordenadas en las que se encuentra. Entrega una lista vacía si la letra no se encuentra.&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;b&gt;def&lt;/b&gt; start_positions&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;letter&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt; positions &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; []&lt;br /&gt;&lt;b&gt;    for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;     &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;         &lt;b&gt;if&lt;/b&gt; dice[facedie[row][column]][face[row][column]] &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; letter:&lt;br /&gt;             positions.append&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;[row, column]&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;b&gt;    return&lt;/b&gt; positions&lt;/pre&gt;Para mejorar un poco la interacción, modifico el ciclo principal para que muestre los dados después de cada intento. Este es un execelente ejemplo de lo que sucede en un proceso de desarrollo, al necesitar afinar la interacción a partir de la evaluación del uso real. Además, como la función &lt;span style="font-style: italic;"&gt;word_is_valid&lt;/span&gt; ahora entregará la lista de coordenadas de la palabra formada, entonces para saber si la palabra fue encontrada, tenemos que revisar el último elemento de la lista.&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;b&gt;while&lt;/b&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;True&lt;/span&gt;:&lt;br /&gt; print_face&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;raw_input&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word.upper&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;#todo en mayusculas&lt;/i&gt;&lt;/span&gt;&lt;br /&gt; &lt;b&gt;if&lt;/b&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"X"&lt;/span&gt;:&lt;br /&gt;     &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Adiós"&lt;/span&gt;&lt;br /&gt;     &lt;b&gt;break&lt;/b&gt;&lt;br /&gt; &lt;b&gt;elif&lt;/b&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;len&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt;:&lt;br /&gt;     &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Demasiado Corta"&lt;/span&gt;&lt;br /&gt; &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;     word_chain &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word_is_valid&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;] &lt;span style="color: rgb(255, 0, 255);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;:&lt;br /&gt;         &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Válida"&lt;/span&gt;, word_chain&lt;br /&gt;     &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;         &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Inválida"&lt;/span&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3270/2772659768_10a5ab1e98.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 295px; height: 196px;" src="http://farm4.static.flickr.com/3270/2772659768_10a5ab1e98.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;Ahora si, pasemos a la pulpa...&lt;br /&gt;El proceso de encontrar la palabra consiste en a partir de la primera letra, buscar la siguiente en las casillas adyacentes, teniendo en cuenta de no buscar en casillas que no existen y sobretodo teniendo en cuenta no usar letras que ya han sido usadas. Si entre las adyacentes encontramos la siguiente letra, pasamos a esta y repetimos el mismo proceso de buscar en las adyacentes hasta que se han acabado las letras de la palabra. Si las letras se acaban y hemos logrado encontrarlas todas en línea, quiere decir que la palabra existe. Si alguna letra no la encontramos, debemos ir hacia atrás para buscar otras posibilidades. Este tipo de procesos son ideales para ser modelados en código por medio de recursión. la recursión es el proceso de llamar la función desde ella misma, hasta que alguna condición permita terminar la cadena. La función &lt;span style="font-style: italic;"&gt;find_word&lt;/span&gt; es una función recursiva, que se llama a si misma mientras la palabra tenga letras. Cuando la llamamos, no le entrego la palabra completa, sino el pedazo de la palabra que falta por encontrar. De esta forma, si se han acabado las letras, sabremos que la palabra fue encontrada.&lt;br /&gt;Para buscar en las casillas adyacentes, uso la matriz &lt;span style="font-style: italic;"&gt;matrix&lt;/span&gt; que guarda las coordenadas relativas a la casilla. Recorro cada una de ellas en un ciclo (cada elemento es la variable &lt;span style="font-style: italic;"&gt;transform&lt;/span&gt;), y en este ciclo, si la letra es encontrada, llamo recursivamente &lt;span style="font-style: italic;"&gt;find_word&lt;/span&gt;.&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;b&gt;def&lt;/b&gt; find_word&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word, row, column, used&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt; matrix &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [[&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;], [&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;],&lt;br /&gt;           [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;],         [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;],&lt;br /&gt;           [&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;] ]&lt;br /&gt; &lt;b&gt;if&lt;/b&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;:&lt;br /&gt;     &lt;b&gt;return&lt;/b&gt; []    &lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;#fin de la palabra-cerrar recursion&lt;/i&gt;&lt;/span&gt;&lt;br /&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; get_letter&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;b&gt;if&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;     new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;2&lt;/span&gt;:]&lt;br /&gt; &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;     new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;:]&lt;br /&gt; &lt;b&gt;for&lt;/b&gt; transform &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; matrix:&lt;br /&gt;     new_row &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; transform[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;]&lt;br /&gt;     new_column &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; transform[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;]&lt;br /&gt;     &lt;b&gt;if&lt;/b&gt;  new_row &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; new_column &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; \&lt;br /&gt;             new_row &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; new_column &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; \&lt;br /&gt;             used[new_row][new_column] &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;:&lt;br /&gt;         &lt;b&gt;pass&lt;/b&gt;&lt;br /&gt;     &lt;b&gt;elif&lt;/b&gt; dice[facedie[new_row][new_column]][face[new_row][new_column]] &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; letter:&lt;br /&gt;         used_copy &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; used&lt;br /&gt;         used_copy[new_row][new_column] &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;         &lt;b&gt;return&lt;/b&gt; [[new_row, new_column]] &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; \&lt;br /&gt;             find_word&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;new_word, new_row, new_column, used_copy&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;b&gt;return&lt;/b&gt; [&lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3297/3205236312_c80198bbec.jpg?v=0"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 194px; height: 194px;" src="http://farm4.static.flickr.com/3297/3205236312_c80198bbec.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;Ya se puede ver en esta función un problema que surge de la existencia de la letra "Qu". En los dados , puede salir la letra "Qu" que debe contarse como una sola letra a pesar de contener dos letras. Esto implica que en todas  las palabras que se entren la palabra es inválida si hay una "q" a la que no le sigue un "u", y además que cuando aparezca "qu" debemos tratarla como una sola letra.&lt;br /&gt;Finalmente, hay que hacer algunas adiciones a la función &lt;span style="font-style: italic;"&gt;word_is_valid&lt;/span&gt; para que busque la primera letra de la palabra, y a partir de esta inicie la recursion con la función &lt;span style="font-style: italic;"&gt;find_word&lt;/span&gt;.&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;b&gt;def&lt;/b&gt; word_is_valid&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;  letter &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; get_letter&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;return&lt;/b&gt; [&lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;]&lt;br /&gt;  &lt;b&gt;elif&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;      new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;2&lt;/span&gt;:]&lt;br /&gt;  &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;      new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;:]&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; position &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; start_positions&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;letter&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;      used &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;]]&lt;br /&gt;      used[position[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;]][position[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;]] &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;      used_copy &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; used&lt;br /&gt;      word_chain &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [[position[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;],position[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;]]] &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; \&lt;br /&gt;              find_word&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;new_word, position[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], position[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;], used_copy&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;] &lt;span style="color: rgb(255, 0, 255);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;:&lt;br /&gt;          &lt;b&gt;return&lt;/b&gt; word_chain&lt;br /&gt;  &lt;b&gt;return&lt;/b&gt; [&lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;]&lt;/pre&gt;Y listo por ahora... En la próxima empezaremos a crear la interfaz visual para nuestro programa (además de buscar un pequeño error que hace que algunas veces no se detecte la palabra correctamente....)&lt;br /&gt;Como siempre aquí está el código:&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt; random&lt;br /&gt;&lt;br /&gt;dice &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [ [&lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"S"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"S"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"I"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"S"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"P"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"F"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"F"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"K"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"N"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"U"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"I"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"H"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"M"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"Qu"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"B"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"J"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"B"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"L"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"N"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"H"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"N"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"R"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"Z"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"H"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"S"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"P"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"C"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"R"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"Y"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"V"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"D"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"L"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"I"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"M"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"U"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"C"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"L"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"R"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"I"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"X"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"D"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"R"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"W"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"H"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"V"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"S"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"I"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"Y"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"D"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"W"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"N"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"G"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"H"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"R"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"Y"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"L"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"W"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"O"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"T"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"A"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"N"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"G"&lt;/span&gt;],&lt;br /&gt;       [&lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"I"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"U"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"N"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"E"&lt;/span&gt;, &lt;span style="color: rgb(221, 0, 0);"&gt;"S"&lt;/span&gt;] ]&lt;br /&gt;&lt;br /&gt;face &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [ [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;] ]&lt;br /&gt;facedie &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [ [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;] ]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; new_dice_set&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;:&lt;br /&gt;  available_dice &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;16&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;          facedie[row][column] &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; random.randint&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(128, 0, 0);"&gt;len&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;available_dice&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;          available_dice.pop&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;facedie[row][column]&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; new_shuffled_group&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;:&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;          face[row][column] &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; random.randint&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;5&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; print_face&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;:&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;          &lt;b&gt;print&lt;/b&gt; dice[facedie[row][column]][face[row][column]], &lt;span style="color: rgb(221, 0, 0);"&gt;" "&lt;/span&gt;,&lt;br /&gt;      &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; get_letter&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word, index&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;  internal_index &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;br /&gt;  real_index &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;return&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;while&lt;/b&gt; internal_index &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; index:&lt;br /&gt;      letter &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Q"&lt;/span&gt;:&lt;br /&gt;          real_index &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; real_index &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;          &lt;b&gt;if&lt;/b&gt; real_index &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;len&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;              letter &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;          &lt;b&gt;elif&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"U"&lt;/span&gt;:&lt;br /&gt;              &lt;b&gt;return&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;br /&gt;      real_index &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; real_index &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;      internal_index &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; internal_index &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;  result &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[real_index]&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; result &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Q"&lt;/span&gt;:&lt;br /&gt;      real_index &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; real_index &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt; real_index &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;len&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;          result &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; result &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"u"&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;return&lt;/b&gt; result&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; start_positions&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;letter&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;  positions &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; []&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;for&lt;/b&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;range&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;          &lt;b&gt;if&lt;/b&gt; dice[facedie[row][column]][face[row][column]] &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; letter:&lt;br /&gt;              positions.append&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;[row, column]&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;return&lt;/b&gt; positions&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; find_word&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word, row, column, used&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;  matrix &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [[&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;], [&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;],&lt;br /&gt;            [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;],         [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;],&lt;br /&gt;            [&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;] ]&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;return&lt;/b&gt; []    &lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;#fin de la palabra-cerrar recursion&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;  letter &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; get_letter&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;      new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;2&lt;/span&gt;:]&lt;br /&gt;  &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;      new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;:]&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; transform &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; matrix:&lt;br /&gt;      new_row &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; row &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; transform[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;]&lt;br /&gt;      new_column &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; column &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; transform[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;]&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt;  new_row &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; new_column &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; \&lt;br /&gt;              new_row &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; new_column &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;or&lt;/span&gt; \&lt;br /&gt;              used[new_row][new_column] &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;:&lt;br /&gt;          &lt;b&gt;pass&lt;/b&gt;&lt;br /&gt;      &lt;b&gt;elif&lt;/b&gt; dice[facedie[new_row][new_column]][face[new_row][new_column]] &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; letter:&lt;br /&gt;          used_copy &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; used&lt;br /&gt;          used_copy[new_row][new_column] &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;          &lt;b&gt;return&lt;/b&gt; [[new_row, new_column]] &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; \&lt;br /&gt;              find_word&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;new_word, new_row, new_column, used_copy&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;return&lt;/b&gt; [&lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def&lt;/b&gt; word_is_valid&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;  letter &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; get_letter&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;return&lt;/b&gt; [&lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;]&lt;br /&gt;  &lt;b&gt;elif&lt;/b&gt; letter &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Qu"&lt;/span&gt;:&lt;br /&gt;      new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;2&lt;/span&gt;:]&lt;br /&gt;  &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;      new_word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;:]&lt;br /&gt;  &lt;b&gt;for&lt;/b&gt; position &lt;span style="color: rgb(255, 0, 255);"&gt;in&lt;/span&gt; start_positions&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;letter&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;:&lt;br /&gt;      used &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], [&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;]]&lt;br /&gt;      used[position[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;]][position[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;]] &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;      used_copy &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; used&lt;br /&gt;      word_chain &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; [[position[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;],position[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;]]] &lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt; \&lt;br /&gt;              find_word&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;new_word, position[&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;], position[&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;], used_copy&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;] &lt;span style="color: rgb(255, 0, 255);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;:&lt;br /&gt;          &lt;b&gt;return&lt;/b&gt; word_chain&lt;br /&gt;  &lt;b&gt;return&lt;/b&gt; [&lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;new_shuffled_group&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;new_dice_set&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;while&lt;/b&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;True&lt;/span&gt;:&lt;br /&gt;  print_face&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;  word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;raw_input&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;  word &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word.upper&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;&lt;i&gt;#todo en mayusculas&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; word &lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"X"&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Adiós"&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;break&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;elif&lt;/b&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;len&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt;:&lt;br /&gt;      &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Demasiado Corta"&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;      word_chain &lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt; word_is_valid&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;word&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt; word_chain[&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;] &lt;span style="color: rgb(255, 0, 255);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;False&lt;/span&gt;:&lt;br /&gt;          &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Válida"&lt;/span&gt;, word_chain&lt;br /&gt;      &lt;b&gt;else&lt;/b&gt;:&lt;br /&gt;          &lt;b&gt;print&lt;/b&gt; &lt;span style="color: rgb(221, 0, 0);"&gt;"Inválida"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Imágenes&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sergis blog: &lt;a href="http://www.flickr.com/photos/srgblog/2772659768/"&gt;http://www.flickr.com/photos/srgblog/2772659768/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;brew books &lt;a href="http://www.flickr.com/photos/brewbooks/3318600273/"&gt;http://www.flickr.com/photos/brewbooks/3318600273/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Quinn-S: &lt;a href="http://www.flickr.com/photos/q-shan/3205236312/"&gt;http://www.flickr.com/photos/q-shan/3205236312/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-3332722698483458458?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/3332722698483458458/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/recibiendo-palabras-parte-2.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/3332722698483458458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/3332722698483458458'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/recibiendo-palabras-parte-2.html' title='Recibiendo palabras (Parte 2)'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-2465015305581667329</id><published>2009-04-24T07:36:00.010-05:00</published><updated>2009-04-24T08:26:04.399-05:00</updated><title type='text'>Recibiendo palabras (Parte 1)</title><content type='html'>Ahora que tenemos listos los dados para jugar, necesitamos al jugador...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/221/483602549_df4b50bac7.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 245px; height: 321px;" src="http://farm1.static.flickr.com/221/483602549_df4b50bac7.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El jugador debe poder entrar las palabras al computador con el teclado. Para esto podemos usar un ciclo "while" que permite al jugador entrar palabras hasta que se canse y entre la letra "x":&lt;br /&gt;&lt;pre class="postCode"&gt;while True:&lt;br /&gt;  word = raw_input("&gt;")&lt;br /&gt;  word = word.upper() #todo en mayusculas&lt;br /&gt;  if word == "X":&lt;br /&gt;      print "Adiós"&lt;br /&gt;      break&lt;br /&gt;  elif len(word) &amp;lt; 3:&lt;br /&gt;      print "Demasiado Corta"&lt;br /&gt;  elif word_is_valid(word):&lt;br /&gt;      print "Palabra válida"&lt;br /&gt;  else:&lt;br /&gt;      print "No válida"&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3068/2801793552_2cdd6d5874.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 215px; height: 160px;" src="http://farm4.static.flickr.com/3068/2801793552_2cdd6d5874.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;Como ven, uso la función &lt;span style="font-style: italic;"&gt;raw_input&lt;/span&gt; y luego convierto todas las letras a mayúsculas usando &lt;span style="font-style: italic;"&gt;upper()&lt;/span&gt;.&lt;br /&gt;Luego reviso si se entró la letra "X" para terminar o si la palabra tiene menos de 3 letras, lo que la hace demasiado corta para el juego. Si la palabra pasa estas pruebas, es necesario luego revisar si se puede formar con los dados, para lo que defino la función &lt;span style="font-style: italic;"&gt;word_is_valid&lt;/span&gt;. Esta función es la primera de nuestro programa que usa &lt;span style="font-style: italic;"&gt;return&lt;/span&gt; para devolver un valor a quien la llama. Lo que hace es evaluar la palabra y da el veredicto de si es válida o no. Además esta función recibe un "argumento", es decir, al llamarla, debemos entregarle una información para que trabaje. En este caso, la información es la palabra a evaluar:&lt;br /&gt;&lt;pre class="postCode"&gt;def word_is_valid(word):&lt;br /&gt; letter = get_letter(word,0)&lt;br /&gt; if letter == "":&lt;br /&gt;     return False&lt;br /&gt; for row in range(4):&lt;br /&gt;     for column in range(4):&lt;br /&gt;         used = [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]]&lt;br /&gt;         if dice[facedie[row][column]][face[row][column]] == letter:&lt;br /&gt;             print "Encontrada ", row, column&lt;br /&gt; return True&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2016/1583519788_c5122ce947.jpg?v=0"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 170px; height: 227px;" src="http://farm3.static.flickr.com/2016/1583519788_c5122ce947.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;Por ahora esta función solo revisa si la primera letra de la palabra se encuentra entre los dados, y reporta si lo está (Esta función la completaré en la parte 2 de este artículo).&lt;br /&gt;En este momento surge un problema complicado, que resulta del hecho que el dado que tiene la "Q" está marcado "Qu", es decir, la Q siempre viene seguida de una U. Por esto la Q seguida de U debe contarse como una sola letra, a pesar de ser en realidad dos. Además se deben declarar inválidas las palabras que tengan una Q que no está seguida por una U, porque no es posible hacerlas con los dados. Para esto creo la función &lt;span style="font-style: italic;"&gt;get_letter&lt;/span&gt;, que me permite averiguar las letras de la palabra, contando la "QU" como una sola letra:&lt;br /&gt;&lt;pre class="postCode"&gt;def get_letter(word, index):&lt;br /&gt;   if index &gt; len(word):&lt;br /&gt;       return ""&lt;br /&gt;   internal_index = 0&lt;br /&gt;   real_index = 0&lt;br /&gt;   while internal_index &amp;lt; index:&lt;br /&gt;        letter = word[real_index]&lt;br /&gt;        if letter == "Q":&lt;br /&gt;            real_index = real_index + 1&lt;br /&gt;            if real_index &lt; len(word):&lt;br /&gt;                letter = word[real_index]&lt;br /&gt;            elif letter != "U":&lt;br /&gt;                return ""&lt;br /&gt;        real_index = real_index + 1&lt;br /&gt;        internal_index = internal_index + 1&lt;br /&gt;    result = word[real_index]&lt;br /&gt;    if result == "Q":&lt;br /&gt;        real_index = real_index + 1&lt;br /&gt;        if real_index &lt; len(word):&lt;br /&gt;            result = result + "u"&lt;br /&gt;    return result&lt;/pre&gt;&lt;br /&gt;A esta función debo entregarle la palabra y el número de la letra que quiero averiguar (la primera se considera la letra 0). Esta función retorna la letra correspondiente a la posición que se pide o ninguna letra ("") si hay algún problema, como que se pidió una casilla que no existe o si hay una Q sin U.&lt;br /&gt;En la segunda parte completaré la función &lt;span style="font-style: italic;"&gt;word_is_valid&lt;/span&gt; para que busque entre los dados la palabra del jugador (Como está el programa todas las palabras las reporta como válidas!). Al unir lo que acabo de mostrar con nuestro programa anterior, tenemos:&lt;br /&gt;&lt;pre class="postCode"&gt;import random&lt;br /&gt;&lt;br /&gt;dice = [ ["T", "O", "E", "S", "S", "I"],&lt;br /&gt;        ["A", "S", "P", "F", "F", "K"],&lt;br /&gt;        ["N", "U", "I", "H", "M", "Qu"],&lt;br /&gt;        ["O", "B", "J", "O", "A", "B"],&lt;br /&gt;        ["L", "N", "H", "N", "R", "Z"],&lt;br /&gt;        ["A", "H", "S", "P", "C", "O"],&lt;br /&gt;        ["R", "Y", "V", "D", "E", "L"],&lt;br /&gt;        ["I", "O", "T", "M", "U", "C"],&lt;br /&gt;        ["L", "R", "E", "I", "X", "D"],&lt;br /&gt;        ["T", "E", "R", "W", "H", "V"],&lt;br /&gt;        ["T", "S", "T", "I", "Y", "D"],&lt;br /&gt;        ["W", "N", "G", "E", "E", "H"],&lt;br /&gt;        ["E", "R", "T", "T", "Y", "L"],&lt;br /&gt;        ["O", "W", "T", "O", "A", "T"],&lt;br /&gt;        ["A", "E", "A", "N", "E", "G"],&lt;br /&gt;        ["E", "I", "U", "N", "E", "S"] ]&lt;br /&gt;&lt;br /&gt;face = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]&lt;br /&gt;facedie = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]&lt;br /&gt;&lt;br /&gt;def new_dice_set():&lt;br /&gt;   available_dice = range(16)&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           facedie[row][column] = random.randint(0,len(available_dice) - 1)&lt;br /&gt;           available_dice.pop(facedie[row][column])&lt;br /&gt;&lt;br /&gt;def new_shuffled_group():&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           face[row][column] = random.randint(0,5)&lt;br /&gt;&lt;br /&gt;def print_face():&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           print dice[facedie[row][column]][face[row][column]], " ",&lt;br /&gt;       print ""&lt;br /&gt;&lt;br /&gt;def get_letter(word, index):&lt;br /&gt;   if index &amp;gt; len(word):&lt;br /&gt;       return ""&lt;br /&gt;   internal_index = 0&lt;br /&gt;   real_index = 0&lt;br /&gt;   while internal_index &amp;lt; index:&lt;br /&gt;       letter = word[real_index]&lt;br /&gt;       if letter == "Q":&lt;br /&gt;           real_index = real_index + 1&lt;br /&gt;           if real_index &lt; len(word):&lt;br /&gt;               letter = word[real_index]&lt;br /&gt;           elif letter != "U":&lt;br /&gt;               return ""&lt;br /&gt;       real_index = real_index + 1&lt;br /&gt;       internal_index = internal_index + 1&lt;br /&gt;   result = word[real_index]&lt;br /&gt;   if result == "Q":&lt;br /&gt;       real_index = real_index + 1&lt;br /&gt;       if real_index &amp;lt; len(word):&lt;br /&gt;           result = result + "u"&lt;br /&gt;   return result&lt;br /&gt;&lt;br /&gt;def word_is_valid(word):&lt;br /&gt;    letter = get_letter(word,0)&lt;br /&gt;    if letter == "":&lt;br /&gt;        return False&lt;br /&gt;    for row in range(4):&lt;br /&gt;        for column in range(4):&lt;br /&gt;            used = [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]]&lt;br /&gt;            if dice[facedie[row][column]][face[row][column]] == letter:&lt;br /&gt;                print "Encontrada ", row, column&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;new_shuffled_group()&lt;br /&gt;new_dice_set()&lt;br /&gt;print_face()&lt;br /&gt;&lt;br /&gt;while True:&lt;br /&gt;    word = raw_input("&gt;")&lt;br /&gt;   word = word.upper() #todo en mayusculas&lt;br /&gt;   if word == "X":&lt;br /&gt;       print "Adiós"&lt;br /&gt;       break&lt;br /&gt;   elif len(word) &amp;lt; 3:&lt;br /&gt;       print "Demasiado Corta"&lt;br /&gt;   elif word_is_valid(word):&lt;br /&gt;       print "Palabra válida"&lt;br /&gt;   else:&lt;br /&gt;       print "No válida"&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Imágenes&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ross Angus: http://www.flickr.com/photos/ross_angus/483602549/&lt;/li&gt;&lt;li&gt;J.Smith831: http://www.flickr.com/photos/29814869@N07/2801793552/&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Karen Horton: http://www.flickr.com/photos/karenhorton/1583519788/&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-2465015305581667329?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/2465015305581667329/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/recibiendo-palabras-parte-1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/2465015305581667329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/2465015305581667329'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/recibiendo-palabras-parte-1.html' title='Recibiendo palabras (Parte 1)'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-5690998160378153748</id><published>2009-04-22T17:05:00.006-05:00</published><updated>2009-04-30T14:02:04.278-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='Sugar'/><title type='text'>Barajando los dados</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2086/2347555407_2b10ccb272.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 173px; height: 129px;" src="http://farm3.static.flickr.com/2086/2347555407_2b10ccb272.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hay que empezar por el principio.&lt;br /&gt;&lt;br /&gt;Antes de entrar en las gráficas y mecanismos del juego como el conteo del tiempo y la revisión de palabras, hay que crear los dados. Para esto, vamos a guardarlos en una lista de Python. Una lista es simplemente eso, un lugar que guarda un elemento tras otro. Cada uno de los 16 dados es una lista de sus seis lados, por ejemplo:&lt;pre class="postCode"&gt;["T", "O", "E", "S", "S", "I"]&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2388/2501630337_346c7aff3b.jpg?v=0"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 136px; height: 204px;" src="http://farm3.static.flickr.com/2388/2501630337_346c7aff3b.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Explicaré el código por partes y al final está el código completo)&lt;br /&gt;&lt;br /&gt;Podemos tener una sola variable que contenga todos los dados. Esta sería una lista que contiene 16 listas así:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;dice = [ ["T", "O", "E", "S", "S", "I"],&lt;br /&gt;["A", "S", "P", "F", "F", "K"],&lt;br /&gt;["N", "U", "I", "H", "M", "Qu"],&lt;br /&gt;["O", "B", "J", "O", "A", "B"],&lt;br /&gt;["L", "N", "H", "N", "R", "Z"],&lt;br /&gt;["A", "H", "S", "P", "C", "O"],&lt;br /&gt;["R", "Y", "V", "D", "E", "L"],&lt;br /&gt;["I", "O", "T", "M", "U", "C"],&lt;br /&gt;["L", "R", "E", "I", "X", "D"],&lt;br /&gt;["T", "E", "R", "W", "H", "V"],&lt;br /&gt;["T", "S", "T", "I", "Y", "D"],&lt;br /&gt;["W", "N", "G", "E", "E", "H"],&lt;br /&gt;["E", "R", "T", "T", "Y", "L"],&lt;br /&gt;["O", "W", "T", "O", "A", "T"],&lt;br /&gt;["A", "E", "A", "N", "E", "G"],&lt;br /&gt;["E", "I", "U", "N", "E", "S"] ]&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2151/2299815836_3050487128.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 125px; height: 167px;" src="http://farm3.static.flickr.com/2151/2299815836_3050487128.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora que ya tenemos dados, necesitamos una cuadrícula para poner los dados. Para esto también podemos crear listas.&lt;br /&gt;Lo que haré es tener dos cuadrículas de 4 por 4. Una contendrá el número del dado que está en esa posición y la otra contiene el número del lado del dado que está visible:&lt;br /&gt;&lt;pre class="postCode"&gt;face = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]&lt;br /&gt;facedie = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]&lt;/pre&gt;&lt;br /&gt;Ahora crearé una función para colocar los dados en una posición. Como no se puede repetir un dado, creo una lista llamada "available_dice", en la que guardo los números de 0 a 15, para cuando salga un dado quitarlo de la lista. Luego para cada posición (row, column) de la lista "facedie", selecciono al azar que dado queda en esa casilla así:&lt;br /&gt;&lt;pre class="postCode"&gt;def new_dice_set():&lt;br /&gt;   available_dice = range(16)&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           facedie[row][column] = random.randint(0,len(available_dice) - 1)&lt;br /&gt;           available_dice.pop(facedie[row][column])&lt;/pre&gt;&lt;br /&gt;Luego hago algo similar con los lados. Para cada casilla, "lanzo" el dado, para que quede uno de sus lados al azar. En la lista "face" guardo el lado visible en cada una de las casillas:&lt;br /&gt;&lt;pre class="postCode"&gt;def new_shuffled_group():&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           face[row][column] = random.randint(0,5)&lt;/pre&gt;&lt;br /&gt;Listo, con esto tenemos la cajita y los dados. ¡Pero aún no los vemos!&lt;br /&gt;Para terminar por ahora haré una sencilla función que muestre los dados en la pantalla, y llamaré las funciones anteriores:&lt;br /&gt;&lt;pre class="postCode"&gt;def print_face():&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           print dice[facedie[row][column]][face[row][column]], " ",&lt;br /&gt;       print ""&lt;br /&gt;&lt;br /&gt;new_shuffled_group()&lt;br /&gt;new_dice_set()&lt;br /&gt;print_face()&lt;/pre&gt;&lt;br /&gt;Ya debes poder ver algo como:&lt;br /&gt;&lt;pre class="postCode"&gt;T   B   P   K&lt;br /&gt;X   Y   E   O&lt;br /&gt;M   U   K   N&lt;br /&gt;P   I   E   E&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Nos vemos en la próxima. Aquí está el código completo:&lt;br /&gt;&lt;pre class="postCode"&gt;import random&lt;br /&gt;&lt;br /&gt;dice = [ ["T", "O", "E", "S", "S", "I"],&lt;br /&gt;["A", "S", "P", "F", "F", "K"],&lt;br /&gt;["N", "U", "I", "H", "M", "Qu"],&lt;br /&gt;["O", "B", "J", "O", "A", "B"],&lt;br /&gt;["L", "N", "H", "N", "R", "Z"],&lt;br /&gt;["A", "H", "S", "P", "C", "O"],&lt;br /&gt;["R", "Y", "V", "D", "E", "L"],&lt;br /&gt;["I", "O", "T", "M", "U", "C"],&lt;br /&gt;["L", "R", "E", "I", "X", "D"],&lt;br /&gt;["T", "E", "R", "W", "H", "V"],&lt;br /&gt;["T", "S", "T", "I", "Y", "D"],&lt;br /&gt;["W", "N", "G", "E", "E", "H"],&lt;br /&gt;["E", "R", "T", "T", "Y", "L"],&lt;br /&gt;["O", "W", "T", "O", "A", "T"],&lt;br /&gt;["A", "E", "A", "N", "E", "G"],&lt;br /&gt;["E", "I", "U", "N", "E", "S"] ]&lt;br /&gt;&lt;br /&gt;face = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]&lt;br /&gt;facedie = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]&lt;br /&gt;&lt;br /&gt;def new_dice_set():&lt;br /&gt;   available_dice = range(16)&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           facedie[row][column] = random.randint(0,len(available_dice) - 1)&lt;br /&gt;           available_dice.pop(facedie[row][column])&lt;br /&gt;&lt;br /&gt;def new_shuffled_group():&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           face[row][column] = random.randint(0,5)&lt;br /&gt;&lt;br /&gt;def print_face():&lt;br /&gt;   for row in range(4):&lt;br /&gt;       for column in range(4):&lt;br /&gt;           print dice[facedie[row][column]][face[row][column]], " ",&lt;br /&gt;       print ""&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;new_shuffled_group()&lt;br /&gt;new_dice_set()&lt;br /&gt;print_face()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fuentes&lt;/span&gt;&lt;br /&gt;&lt;a href="http://matthewjamestaylor.com/blog/online-boggle-dice-shaker"&gt;Blog de Matthew James Taylor&lt;/a&gt;: De este blog tomé el contenido de los dados.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Créditos Imágenes&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;topher76: &lt;a href="http://www.flickr.com/photos/topher76/293277608/"&gt;http://www.flickr.com/photos/topher76/293277608/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Andrés Rueda: &lt;a href="http://farm3.static.flickr.com/2086/2347555407_2b10ccb272.jpg?v=0"&gt;http://farm3.static.flickr.com/2086/2347555407_2b10ccb272.jpg?v=0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;tanakawho: &lt;a href="http://www.flickr.com/photos/28481088@N00/2299815836/"&gt;http://www.flickr.com/photos/28481088@N00/2299815836/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-5690998160378153748?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/5690998160378153748/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/barajando-los-dados.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/5690998160378153748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/5690998160378153748'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/barajando-los-dados.html' title='Barajando los dados'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-208521052775217986</id><published>2009-04-22T15:54:00.001-05:00</published><updated>2009-04-23T06:50:44.363-05:00</updated><title type='text'>Iniciando el juego "Caza Palabras"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/192/505768192_3c08c4932d.jpg?v=1179667289"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 394px; height: 394px;" src="http://farm1.static.flickr.com/192/505768192_3c08c4932d.jpg?v=1179667289" alt="" border="0" /&gt;&lt;/a&gt;He decido iniciar el desarrollo de un juego sencillo y documentar el proceso para desentrañar los misterios de Sugar (Nada mejor que explicar un tema mientras se aprende para asegurarse que se entendió...)&lt;br /&gt;Quiero hacer un juego basado en &lt;a href="http://en.wikipedia.org/wiki/Boggle"&gt;Boggle&lt;/a&gt;. Este juego consiste en encontrar palabras en una cuadrícula de 4x4, que contiene dados con letras.&lt;br /&gt;Iré contando paso a paso los detalles de la construcción, y espero llegar a terminarlo...&lt;br /&gt;¿Qué se necesita para seguir el desarrollo? Sólo un editor de texto para escribirlo y &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, el lenguaje de programación para correrlo. En un XO, se puede usar Pippy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Foto por squacco: http://www.flickr.com/photos/squeakywheel/505768192/ Licencia CC-BY-SA)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-208521052775217986?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/208521052775217986/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/iniciando-el-juego-arma-palabras.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/208521052775217986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/208521052775217986'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/04/iniciando-el-juego-arma-palabras.html' title='Iniciando el juego &quot;Caza Palabras&quot;'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3585005229267063154.post-1800695885878329228</id><published>2009-03-23T07:19:00.000-05:00</published><updated>2009-04-22T18:44:06.670-05:00</updated><title type='text'>Bienvenidos al ingenio azucarero</title><content type='html'>Hola,&lt;br /&gt;&lt;br /&gt;En este blog documentaré mis experiencias desarrollando para la la plataforma Sugar (Azucar).&lt;br /&gt;&lt;br /&gt;Este blog asume que ya tienes &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; instalado, y que tienes algún conocimiento de programación en &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;. Existen muchas introducciones a Python circulando en Internet, por ejemplo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cristalab.com/tips/introduccion-a-python-c51723l/"&gt;Introducción a Python de CrystalLab&lt;/a&gt;&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com.co/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=6&amp;amp;url=http%3A%2F%2Fwww.xinug.org%2Fdrupal%2Ffiles%2Fcharlas%2Fintro-python.pdf&amp;amp;ei=zKHvSeKwGtSMtgfosvDMDw&amp;amp;usg=AFQjCNGI98-eQoTQFRRwasm9o-ojYHubrg&amp;amp;sig2=RlLpP8cZfhdprY51Tsii8A"&gt;Intro-python de Xinug&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; Si tienes preguntas o comentarios, anímate y pregunta!&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;Andrés&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3585005229267063154-1800695885878329228?l=elingenioazucarero.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://elingenioazucarero.blogspot.com/feeds/1800695885878329228/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/03/bienvenida.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/1800695885878329228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3585005229267063154/posts/default/1800695885878329228'/><link rel='alternate' type='text/html' href='http://elingenioazucarero.blogspot.com/2009/03/bienvenida.html' title='Bienvenidos al ingenio azucarero'/><author><name>Andres Cabrera</name><uri>http://www.blogger.com/profile/12986648151615491547</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
