Correr tu propio código junto con Tkinter

Problema

El método .mainloop( ) de tkinter es un bucle infinito que se encarga de procesar eventos una vez que los widgets estáticos han sido creado (una vez que se ha inicializado la UI) y de actualizar la ventana.
Si queremos introducir nuestro código, para que por ejemplo procese eventos externos:
  • Podemos usar el método after(delay_ms, callback=None, *args) para llamar a una función cada un determinado tiempo (en ms).
¿Y si queremos ejecutar un bucle infinito en paralelo al mainloop del tkinter que por ejemplo monitorice un log?:
  • Podemos usar el método anterior para llamar a la función que contendrá el bucle infinito y usar el método update( ) dentro de la función. Este método fuerza a que se actualice la ventana.
  • Ejecutar tkinter en un hilo (thread) diferente. Ver el código abajo.
Código

Código sacado de stackoverflow:
import Tkinter
import threading
class MyTkApp(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.start()
    def callback(self):
       self.root.quit()
    def run(self):
        self.root=Tkinter.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.callback)
        self.s = Tkinter.StringVar()
        self.s.set('Foo')
        l = Tkinter.Label(self.root,textvariable=self.s)
        l.pack()
        self.root.mainloop()
app = MyTkApp()
print 'now can continue running code while mainloop runs'
Enlaces

Can't invoke "update" command:  application has been destroyed.

Vigilando un log en Python: tail -f

Tail

Tail es un programa para los sitemas tipo Unix que devuelve las últimas lineas de uno o mas archivos. Tiene una opción especial -f (follow) que monitoriza un archivo. De tal manera que a medida que otro programa añade lineas al archivo, tail las va mostrando.

import time

def follow(thefile):
     thefile.seek(0,2) # Go to the end of the file
     while True:
          line = thefile.readline()
          if not line:
               time.sleep(0.1) # Sleep briefly
               continue
          yield line
Para usarlo:
logfile = open("access-log")
loglines = follow(logfile)

for line in loglines:
     print(line)

Python 2.7 + Numpy + OpenCV

Python

Descarga de python 2.7.5 X86-64: http://www.python.org/ftp/python/2.7.5/python-2.7.5.amd64.msi

Numpy

Página web: http://www.numpy.org/

Numpy es una extensión de python para agregarle herramientas avanzadas de programación numérica.

Para descargar la versión X86-64 es necesario ir a http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

OpenCV

Página web: http://opencv.org/

OpenCV es una librería de código abierto destinado al procesamiento de imágenes, principamente en tiempo real.

Para instalar las bindings para python 2.7: http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

Enlaces de interes

Generar ejecutables en python: cx_Freeze

Página web y descarga: http://cx-freeze.sourceforge.net/

Creando el script

Para hacer uso de distutils deberemos crear un script (llamado setup.py por convención):
import sys
from cx_Freeze import setup, Executable

base="Win32GUI"

setup(  name = "prueba",
        version = "0.1",
        description = "Mi script de prueba",
        executables = [Executable("prueba.py", base=base)])
Se pueden ver mas ejemplos de scripts aquí.

Corriendo el script

Para invocar el script anteriormente creado abrimos el símbolo del sistema, nos dirigimos al directorio donde este almacenado y escribimos:
python setup.py build
Nos creará un directorio llamado build que contendrá el ejecutable.

EQ GuildViewer 0.1

Descripción

Programa escrito en Python para poder ver los integrantes de la guild en el EverQuest Classic en la que estemos. Se apoya en un conjunto de macros que deberemos presionar dentro del juego.

Descarga

Enlace para descargar el GuildViewer:

Configuración

Dado que el programa parsea la información del archivo "Log.txt" deberemos colocarlo en el directorio donde se encuentre dicho archivo. Algunas hubicaciones donde puede estar alojado son:
  • C:\Program Files (x86)\Sony\EverQuest\Logs
  • C:\Users\Nombre\AppData\Local\VirtualStore\Program Files (x86)\Sony\EverQuest\Logs
Deberemos crear un conjunto de 9 macros dentro del juego (podemos meterlas o bien a mano o localizando el archivo X_project1999, donde X es el nombre de nuestro personaje). Fijaros en el número de página para no sobreescribir las que ya tengais:
  1. Page3Button1Name=GUILD
    Page3Button1Color=14
    Page3Button1Line1=/who all guild 1 19
    Page3Button1Line2=/who all guild 20 29
    Page3Button1Line3=/who all guild 30 39
    Page3Button1Line4=/who all guild 40 49
    Page3Button1Line5=/who all guild 50 59
  2. Page3Button7Name=GUILD2
    Page3Button7Color=14
    Page3Button7Line1=/who all guild Bard
    Page3Button7Line2=/who all guild Cleric 
    Page3Button7Line3=/who all guild Druid
    Page3Button7Line4=/who all guild Enchanter
    Page3Button7Line5=/who all guild Magician
  3. Page3Button2Name=GUILD3
    Page3Button2Color=14
    Page3Button2Line1=/who all guild Monk
    Page3Button2Line2=/who all guild Necromancer
    Page3Button2Line3=/who all guild Paladin
    Page3Button2Line4=/who all guild Ranger
    Page3Button2Line5=/who all guild Rogue
  4. Page3Button8Name=GUILD4
    Page3Button8Color=14
    Page3Button8Line1=/who all guild Shadow
    Page3Button8Line2=/who all guild Shaman
    Page3Button8Line3=/who all guild Warrior
    Page3Button8Line4=/who all guild Wizard
  5. Page3Button3Name=GUILD5
    Page3Button3Color=14
    Page3Button3Line1=/who all guild Barbarians
    Page3Button3Line2=/who all guild Dark
    Page3Button3Line3=/who all guild Dwarves
    Page3Button3Line4=/who all guild Erudites
    Page3Button3Line5=/who all guild Gnomes
  6. Page3Button9Name=GUILD6
    Page3Button9Color=14
    Page3Button9Line1=/who all guild Half-Elves
    Page3Button9Line2=/who all guild Halflings
    Page3Button9Line3=/who all guild High
    Page3Button9Line4=/who all guild Humans
    Page3Button9Line5=/who all guild Iksar
  7. Page3Button4Name=GUILD7
    Page3Button4Color=14
    Page3Button4Line1=/who guild all Ogres 
    Page3Button4Line2=/who guild all Trolls
    Page3Button4Line3=/who guild all Wood
    Page3Button4Line4=/who guild all LFG
    Page3Button8Line5=/who all guild 60
    Page3Button4Line5=/who guild all
  8. Page3Button6Name=LOG ON
    Page3Button6Color=17
    Page3Button6Line1=/log on
    Page3Button6Line2=/say t0001
  9. Page3Button12Name=LOG OFF
    Page3Button12Color=13
    Page3Button12Line1=/say t0000
    Page3Button12Line2=/log off
Uso

Con el programa abierto o cerrado presionamos las macros en este orden dentro del juego:
  • LOG ON, GUILD, GUILD1, ..., GUILD7, LOG OFF
Nos vamos al programa y elegimos en la parte izquierda el personaje con el que esteamos dentro del juego (si no aparece ninguno reiniciamos el programa) y le damos al botón de la parte derecha.

Imágenes

EQ GuildViewer 0.1

























Fallos y mejoras

Es posible que no muestre todos los integrante anónimos/rol de la guild, esto de debe a una limitación del EQ el cual no posibilita que hagamos un /who con el parámetro ANONYMOUS.

Futuras mejoras:
  • Mostrar el número de integrantes y el nombre de la guild.
  • Posibilidad de hacer scroll en el listado de miembros.
  • Llevar un registro de todos los miembros de la guild.
  • Posibilidad de elegir el directorio del log desde el propio programa.
  • Posibilidad de ordenar a los integrantes por zona, nivel, nombre, raza o clase.

Tutoriales: tkinter

Tkinter

Página web: https://wiki.python.org/moin/TkInter

Algunos tutoriales sobre tkinter:

Empezando: Python 3.3 y pyttk.

Phython

Página web: http://www.python.org/

Pypi + EasyInstall + pyttk

Descripción de la Wikipedia sobre Pypi:
El Python Package Index o PyPI es el repositorio de software oficial para aplicaciones de terceros en el lenguaje de programación Python. Los desarrolladores de Python pretenden que sea un catálogo exhaustivo de todos los paquetes de Python escritos en código abierto.
Existen varias maneras de obtener paquetes de Pypi e introducirlos en la instalación de Python como por ejemplo EasyInstall.
Para instalar EasyInstall de forma sencilla en Windows podemos correr el programa ez_setup.py (conviene desinstalar versiones anteriores antes).

Pyttk es una librería que actua como "wrapper" de tk. Para instalarla con EasyInstall deberemos ir a un terminal y escribir:
easy_install pyttk
Variable de entorno en Windows 7

Para añadir las variables de entorno en Windows 7:
  • Nos dirigimos a: 
    • Inicio, Botón derecho en equipo, propiedades, configuración avanzada del sistema, opciones avanzadas y variables de entorno.
  • Creamos una nueva variables:
    • Variable: PYTHON_HOME
    • Valor: C:\Python33\ (dependiendo de donde hayamos instalado Python).
  • Editamos la variable PATH y añadimos dos nuevos valores, separados por punto y coma:
    • %PYTHON_HOME%
    • %PYTHON_HOME%\Scripts

Enlaces de interes

Interfaces gráficas de usuario en Python