domingo, 6 de septiembre de 2009

Windows 7 pecados

Se ha lanzado una nueva campaña por parte de la FSF (Free software Foundation), la cuál mediante 7 puntos, trata de explicar los problemas a los cuales estamos sujetos si utilizamos el nuevo sistema operativo de Microsoft, windows 7, la página de dicha campaña es : windows7sins.org.

Un colega linuxero (revapaus.org) ha traducido los puntos que vienen en la página oficial de la campaña, reutilizo su texto:

Windows 7 Sins

Los pecados de Windows 7 (es un juego de palabras por lo que se puede entender también como los 7 pecados de Windows): El caso en contra de Microsoft y el software propietario.

La nueva versión del Sistema operativo de Microsoft, Windows 7, tiene el mismo problema que tenían Vista, XP y todas las versiones anteriores – son software propietario. Los usuarios no tienen permitido compartir o modificar el software Windows, o examinar como funciona por dentro.

El hecho de que Windows 7 sea propietario significa que Microsoft tiene control legal sobre sus usuarios, a través de una combinación de copyrights, contratos y patentes. Microsoft utiliza este poder para abusar de los usuarios de computadoras. En windows7sins.org, the Free Software Foundation enumera siete ejemplos de abuso cometidos por Microsoft.

  1. Envenena la educación: Hoy, la mayoría de los niños para quienes su educación involucra computadoras están siendo enseñados a utilizar el producto de una empresa: el producto de Microsoft.
  2. Invade la privacidad: Microsoft utiliza software con nombres capciosos como Windows Genuine Advantage para inspeccionar los contenidos de los discos duros de los usuarios. El acuerdo de licencia que los usuarios deben firmar antes de poder usar Windows avisa que Microsoft reclama el derecho de hacer esto sin ninguna advertencia.
  3. Practicas monopolicas: Casi todas las computadoras adquiridas tienen Windows pre-instalado – Pero no por elección. Microsoft establece directrices a los vendedores de hardware, quienes no ofrecerán PC's sin Windows instalado en ellas. Incluso las computadoras disponibles con otros sistemas operativos pre-instalados como GNU/Linux suelen tener Windows en un principio.
  4. Lock-in: Microsoft intenta forzar la actualización de sus usuarios, dejando sin soporte versiones anteriores de Windows y Office, e inflando los requerimientos de hardware. Para muchas personas, esto implica desechar computadoras que funcionan solamente por que no cubren los requisitos necesarios para las nuevas versiones de Windows.
  5. Estándares abusivos: Microsoft ha intentado detener la libre estandarización de los formatos de documento, por que los estándares como el Open Document Format mermarán el control que ahora tienen sobre los usuarios de los formatos propietarios de Word. Lo han intentado con prácticas miserables, incluyendo el soborno a oficiales, en su intento por detener estos esfuerzos.
  6. Impulsar la Gestión de Restricciones Digitales(DRM): Con el Windows Media Player, Microsoft trabaja coludido con las grandes empresas de multimedia para imponer restricciones a la copia y reproducción de media en su sistema operativo. Por ejemplo, por petición de la NBC Microsoft previene a los usuarios de Windows de grabar programas televisivos que tienen derecho a grabar.
  7. Amenazar la seguridad de los usuarios: Windows tienen una larga historia de vulnerabilidades de seguridad, permitiendo la propagación de los virus y la toma de control de las computadoras de los usuarios por parte de terceros para el envío de spam. Como el software es secreto, todos los usuarios dependen de Microsoft para resolver estos problemas – pero en fondo Microsoft tiene sus propios intereses de seguridad, que no son los de sus usuarios.

Ustedes ¿qué opinan?, creen que con éstas campañas de la FSF las personas dejen de utilizar éstos sistemas operativos?, ¿Le ven futuro a Windows 7?, ¿Fracasará igual que Windows Vista?


Fuente: http://www.antoniomtz.org/

wxPython en 15 pasos

wxPython en 15 pasos

Escribir programas con wxPython en 15 pasos

Cada vez que aprendemos un nuevo lenguaje de programacion nos encontramos en la disyuntiva de optar por las librerias adecuadas para cada necesidad, una de estas necesidades es la seleccion de un conjunto de widgets para el desarrollo de la interfaz de usuario. En el caso especifico de Python las alternativas para cubrir esta necesidad son varias. En esta serie de apuntes comenzaremos a investigar y desarrollar breves tutoriales que mostrara algunas de estas librerias en suficiente profundidad como para conocer las prestaciones basicas de la misma. En esta primera entrega nos referiremos a la libreria de widgets wxPython, en entregas futuras abordaremos otras opciones como TKInter, QT, etc. Tambien se prentende presentar una metodologia basica de programacion de interfaces de usuarios graficas e introducir en las buenas practicas de programacion. Para ello crearemos una aplicacion sencilla donde se pueda aplicar los conocimientos adquiridos.

Objetivos:

  • Conocer las tecnicas basicas de programacion de GUIS
  • Comprender cada uno de los metodos y parametros usados por wxPython
  • Servir de base para el desarrollo de nuestras propias aplicaciones

Temas:

  • La creacion de un programa con interfaz de usuario grafica GUI
  • Creacion de widgets
  • Incorporacion de widgets en los contenedores
  • Vincular y manipular eventos
  • Manipular los valores de los widgets

El documento esta escrito de manera lineal y con la informacion estrictamente necesaria para comprender lo que se prentende enseñar, se explica paso a paso y de manera incremental la creacion de un pequeña aplicacion detallando los aspectos necesarios para la comprension sin abundar en detalles que puedan resultar confusos, luego el lector podra profundizar en los conceptos necesarios, para ello al final del documento se sugiere lectura relacionada.

Paso 1: Importacion del modulo

Lo primero que tenemos que hacer es importar el modulo, para poder hacerlo es importante no olvidarse que tenemos que tener instalado tanto el interprete de python como las librerias wxPython, en Debian la instalacion de ambos se hace con apt-get con los siguientes comandos:

apt-get install python python-wxaddons

Veamos ahora el codigo fuente de nuestro primer programa:

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"

Vamos a usar para corroborar el correcto funcionamiento el manejo de excpciones de python mediante try y except, intenta importar el modulo, si la importacion no da errores continua, en caso de producirse un error lanza una excepcion y muestra un mensaje de error.

Paso 2: Creacion de una clase

Python es un lenguaje de programacion orientado a objetos, por lo tanto lo logico es que nuestra aplicacion sea una clase, en wxPython, heredamos de wx.Frame, que es la clase base para ventanas estándar.

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):

Paso 3: El constructor

Un GUI es una jerarquía de objetos, un botón puede estar contenido en un panel que figura en una solapa que es contenido en una ventana, etc.

Por lo tanto, cada elemento gráfico tiene un padre (su contenedor, por lo general). Por lo tanto tambien tiene un constructor padre (parent) como parámetro. Hacer un seguimiento de los padres es muy útil cuando tenemos que mostrar/ocultar un grupos de widgets, redibujar la pantalla o simplemente destruirlas cuando la aplicación termina. Asi, simpleapp_wx hereda de wx.Frame, por lo que tenemos que llamar al constructor wx.Frame (wx.Frame.__init__ ()).

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)

El objeto wx.Frame tiene dos parámetros: id (identificador del widget) y title (el título de la ventana).

Paso 4: Mantener relacion con el padre

Es una buena costumbre, cuando se realiza la construcción de cualquier tipo de componente GUI, mantener una referencia a nuestra clase padre.

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent

Paso 5: Inicializacion de nuestro GUI

Usualmente es mejor tener la porción de código que crea todos los elementos GUI (botón, campos de texto …) separado de la lógica del programa. Es por eso que creamos el metodo initialize(). Vamos a crear todos los widgets (botones, campo de texto, etc) en este método.

En wxPython tenemos que usar self.Show(True) para forzar que la ventana se muestre en pantalla (de lo contrario permanecera oculta).

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()
def initialize(self):
self.Show(True)

Paso 6: Creacion de la clase principal

Ya tenemos un clase completamente funcional y sintacticamente correcta, vamos a usarla!

Creamos una funcion main que se ejecuta cuando el programa se invoca desde la línea de comandos.

En wxPyhon, es obligatoria la instanciacion de un objeto wx.App () antes de la creación de los elementos del GUI. Por lo que hacemos app = wx.App (). Luego instanciamos nuestra clase (frame = simpleapp_wx ()). Asimismo, no le asignamos ningun padres (None), porque es el primer elemento GUI que vamos a construir. Usamos -1 a dejar a wxPython elegir un identificador (id) propio. Y damos nuestra ventana un título: «Mi aplicacion».

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()
def initialize(self):
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')

Paso 7: Entramos en el loop

Ahora, le tenemos que decir a nuestro programa que entre en un bucle esperando eventos, esto lo hacemos con mainloop ()

Esto significa que cada programa entra en un bucle "infinito", ya veremos que no tanto, a la espera de eventos (ej. clic en un botón, pulsacion de una tecla, alguna accion con el raton, etc.) En wxPython el bucle principal recibirá estos eventos y los manejara en consecuencia. Esto se llama programacion event-driven o controlada por eventos (debido a que el programa no hará nada, sino esperar los eventos, y sólo reaccionara cuando se reciba uno de ellos).

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()
def initialize(self):
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Ya estamos en condiciones de ejecutar nuestro programa y ver el primer resultado, yo programo desde VIM, por lo que hago lo siguiente, :w para grabar, luego :!python % para ejecutar el interprete y pasarle como parametro el archivo que actualemente se encuentra en el buffer. Si usa otro editor grabe el programa y desde linea de comandos cambiele los permisos para hacerlo ejecutable por el dueño con:

chmod u+x programa.py

Luego invoquelo de la siguiente manera:

./programa.py

Podremos ver nuestro programa en accion, por una parte es estimulante ver una ventana en modo grafico con todos los botones y el aspecto identico al resto de nuestras ventans, pero por otra parte es decepcionante ver la ventana vacia, por lo que en los proximos pasos iremos poblandola con widgets.

Paso 8: Diseño de interfaz

Hay varias manera de incrustar widgets en una ventana (o en otro contenedor): Añadir apilados horizontalmente, verticalmente, en una grilla, etc

Existen diferentes clases, llamadas gestores de diseño (layout managers), capaces de colocar los widgets en los contenedores de diferentes maneras. Algunos son más flexibles que otros. Cada contenedor (ventana, panel, solapa, diálogo …) puede tener su propio gestor de diseño.

Yo recomiendo el gestor de diseño grid (grilla). Se trata de una simple grilla donde se pueden incrustar los widgets, algo parecido a una tabla con filas y columnas donde se pueden ir incroporando nuestros elementos. Por ejemplo: Ponga un botón en la columna 2, fila 1. Ponga una casilla en la columna 5, fila 3. etc.

En wxPython, para crear el gestor de diseño del tipo grilla usamos grilla=wx.GridBagSizer() y luego le indicamos a nuestra ventana que lo use (self.SetSizerAndFit(grilla)).

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()
def initialize(self):
grilla = wx.GridBagSizer()
self.SetSizerAndFit(grilla)
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Obtendremos una ventana minima que puede ser redimensionada.

Paso 9: Agregar un widget de entrada de texto

Los pasos para agregar un widget a un contenedor son dos, primero debemos definirlo para crearlo, luego lo agregamos a un gestor de diseño, vamos por partes entonces.

Crear del widget

El objeto que vamos a crear es una netrada de texto en wxPython esa clase se lla TextCtrl y lo hacemos asi (self.entrada=wx.TextCtrl()), pasamos como parametro self y el padre, porque nuestra ventana será el padre de este widget, es decir que aparecera dentro de nuestra ventana.

TextCtrl reciba dos parámetros ademas de self, -1 (para que wxPython asigne automáticamente un identificador), y el texto a mostrar (value=u"Enter text here.").

Tenga en cuenta que mantenemos una referencia a este widget en nuestra clase: self.entrada =…, esto se debe a que tenemos que acceder a ella más adelante, desde otros métodos.

Agregar el widget

Ahora, lo agregaremos a nuestros gestor de diseño (GridBagSizer).

Llamamos al metodo .Add() de nuestra grilla, le pasamos el widget que acaba de crear (self.entrada) y sus coordenadas de ubicacion en la grilla (0,0) y (1,1) que es el espaciado alrededor del widget. En nuestro caso, el widget no se extienden a varias celdas, wx.EXPAND le dice al gestor de diseño (grilla) que debe ampliar la entrada de texto si su celda es redimencionada.

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()
def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:")
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
self.SetSizerAndFit(grilla)
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Tenemos una ventana con un solo campo de texto. Usted puede incluso ingresar en algún texto por teclado. Pero tenemos un problema, el campo de texto no cambia de tamaño cuando redimenciono la ventana. No se preocupe, hay una buena razón para esto, le dijimos al campo de entrada de texto que debia redimensionarse automáticamente si su columna o celda se expande, pero aún no le especificamos al gestor de diseño (grilla) que cuando la ventana se redimensiona tambien lo debe hacer la grilla. Ya veremos como hacerlo mas adelante.

Paso 10: Agregar un nuevo widget, un boton

Muy simple, ya vimos como hacerlo, crear el botón y añadirlo. Tenga en cuenta que en este caso, no mantenemos una referencia al botón (ya que vamos a leer ni alterar su valor en ningun momento).

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()
def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:")
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
boton = wx.Button(self,-1,label="Pulsame !")
grilla.Add(boton, (0,1))
self.SetSizerAndFit(grilla)
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Observe como ubicamos el nuevo widget, el boton, usando las coordenadas (0,1) sin espaciado. En este punto tenemos una ventana con un campo de texto y un botón.

Paso 11: Agregar otro widget, una etiqueta

Se trata de un StaticText en wxPython. Le pondremos coleres personalizados, usaremos un texto blanco sobre fondo azul, tenemos que llamar dos métodos para ello (SetForegroundColour y SetBackgroundColour), el texto estara alineado a la izquierda por defecto, ubicamos la etiqueta en nuestro gestor de diseño, la grilla, pero esta vez el nuevo widget se extienden a través de dos celdas (de modo que aparezca por debajo del campo de texto y del botón.), para ello se debe especificar un area de (1,2), es decir una celda verticalmente, y dos celdas horizontalmente. Finalmente para la expancion de la etiqueta usamos wx.EXPAND.

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"

class simpleapp_wx(wx.Frame):

def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()

def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:")
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
boton = wx.Button(self,-1,label="Pulsame !")
grilla.Add(boton, (0,1))
self.etiqueta = wx.StaticText(self,-1,label=u'Hola !')
self.etiqueta.SetBackgroundColour(wx.BLUE)
self.etiqueta.SetForegroundColour(wx.WHITE)
grilla.Add( self.etiqueta, (1,0),(1,2), wx.EXPAND )
self.SetSizerAndFit(grilla)
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Ya tenemos tres widgets en nuestra aplicacion, todavia no hacen nada ni se ven bien cuando redimensionamos la ventana, pero seguiremos mejorando nuestro programa.

Paso 12: Habilitar redimensionamiento

Ahora le decimos a la gestor de diseño que tiene que cambiar el tamaño de sus columnas y filas cuando la ventana es redimensionada. Sólo la primera columna (0), para ello usaremos AddGrowableCol(), Tenga en cuenta que hay otros parámetros. Por ejemplo, algunas columna pueden crecer más que otras cuando se cambia el tamaño, eso se logra con el parámetro es de peso (En nuestro caso, simplemente se debe poner en 1).

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"

class simpleapp_wx(wx.Frame):

def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()

def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:")
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
boton = wx.Button(self,-1,label="Pulsame !")
grilla.Add(boton, (0,1))
self.etiqueta = wx.StaticText(self,-1,label=u'Hola !')
self.etiqueta.SetBackgroundColour(wx.BLUE)
self.etiqueta.SetForegroundColour(wx.WHITE)
grilla.Add( self.etiqueta, (1,0),(1,2), wx.EXPAND )
grilla.AddGrowableCol(0)
self.SetSizerAndFit(grilla)
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Ahora intente cambiar el tamaño de la ventana. El campo de texto y la etiqueta azul ahora cambian de tamaño correctamente para adaptarse al tamaño de la ventana. Pero no se ve tan bien cuando redimensionamos la ventana verticalmente.

Paso 13: Agregar limitaciones

Vamos a añadir un contraint de modo que el usuario sólo pueda modificar el tamaño de la ventana horizontalmente. En consecuencia, para impedir el cambio de tamaño vertical de la ventana especificaremos el ancho y alto máximos y mínimos de la ventana, establecemos el alto mínimo y máximo de nuestra actual ventana (self.GetSize().y) a fin de que la ventana no se puede cambiar el tamaño verticalmente. Para ello dejamos en los valores -1 y -1 para el ancho (y) anchura de manera que la ventana puede ser libremente redimensionada horizontalmente (-1 significa "Sin límite").

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"

class simpleapp_wx(wx.Frame):

def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent
self.initialize()

def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:")
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
boton = wx.Button(self,-1,label="Pulsame !")
grilla.Add(boton, (0,1))
self.etiqueta = wx.StaticText(self,-1,label=u'Hola !')
self.etiqueta.SetBackgroundColour(wx.BLUE)
self.etiqueta.SetForegroundColour(wx.WHITE)
grilla.Add( self.etiqueta, (1,0),(1,2), wx.EXPAND )
grilla.AddGrowableCol(0)
self.SetSizerAndFit(grilla)
self.SetSizeHints(-1,self.GetSize().y,-1,self.GetSize().y );
self.Show(True)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Paso 14: manejador de eventos y modificacion de atributos

Los manejadores de eventos (event handler) son métodos que se llaman cuando algo sucede en el GUI. Relacionamos en el manejador de eventos widgets especificos con eventos puntuales. De esta forma decimos que es lo que tiene que hacer la aplicacion ante cualquier evento que pueda ser capturado, por ejemplo, cuando se hace clic con raton sobre el boton o se presiona ENTER en el campo de texto.

Creamos un metodo SiCliqueaBoton(), método que se llama cuando se hace clic en el botón. Tambien creamos un metodo SiPulsamosEnter(), método que se llamará luego de presionar ENTER en el campo de texto. Observe que es necesario agregar en la entrada el parametro style=wx.TE_PROCESS_ENTER para que este sea capaz de procesar el pulsado de la tecla enter.

En cada uno de estos metodos modificamos a su vez la etiqueta usando el metodoGetValue() para tomar el valor actual del campo de texto y SetLabel() para establecer el nuevo valor de la etiqueta mas una leyenda discrecional con la accion realizada.

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"

class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent self.initialize()

def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:", style=wx.TE_PROCESS_ENTER)
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
self.entrada.Bind(wx.EVT_TEXT_ENTER, self.SiPulsaEnter)
boton = wx.Button(self,-1,label="Pulsame !")
grilla.Add(boton, (0,1))
boton.Bind (wx.EVT_BUTTON, self.SiCliqueaBoton)
self.etiqueta = wx.StaticText(self,-1,label=u'Hola !')
self.etiqueta.SetBackgroundColour(wx.BLUE)
self.etiqueta.SetForegroundColour(wx.WHITE)
grilla.Add(self.etiqueta, (1,0),(1,2), wx.EXPAND )
grilla.AddGrowableCol(0)
self.SetSizerAndFit(grilla)
self.SetSizeHints(-1,self.GetSize().y,-1,self.GetSize().y )
self.Show(True)

def SiCliqueaBoton(self,event):
self.etiqueta.SetLabel(self.entrada.GetValue() + "Cliqueo el boton!")

def SiPulsaEnter(self,event):
self.etiqueta.SetLabel(self.entrada.GetValue() + "Pulso enter!")

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Paso 15: Fijar foco

Como ultimo agregado, haremos que el cambo de entrada de texto obtenga el foco y se seleccione el texto contenido, para ello agregaremos tanto en el metodo initialize como en cada uno de los metodos llamados por lo eventos un par de lineas, self.entrada.SetFocus() y self.entrada.SetSelection(-1,-1). Veamos ahora nuestro programa terminado y lo ejecutemos para probarlo.

#!/usr/bin/python
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"

class simpleapp_wx(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,id,title)
self.parent = parent self.initialize()

def initialize(self):
grilla = wx.GridBagSizer()
self.entrada = wx.TextCtrl(self,-1,value=u"Ingrese un texto:", style=wx.TE_PROCESS_ENTER)
grilla.Add(self.entrada,(0,0),(1,1),wx.EXPAND)
self.entrada.Bind(wx.EVT_TEXT_ENTER, self.SiPulsaEnter)
boton = wx.Button(self,-1,label="Pulsame !")
grilla.Add(boton, (0,1))
boton.Bind (wx.EVT_BUTTON, self.SiCliqueaBoton)
self.etiqueta = wx.StaticText(self,-1,label=u'Hola !')
self.etiqueta.SetBackgroundColour(wx.BLUE)
self.etiqueta.SetForegroundColour(wx.WHITE)
grilla.Add(self.etiqueta, (1,0),(1,2), wx.EXPAND )
grilla.AddGrowableCol(0)
self.SetSizerAndFit(grilla)
self.SetSizeHints(-1,self.GetSize().y,-1,self.GetSize().y )
self.entrada.SetFocus()
self.entrada.SetSelection(-1,-1)
self.Show(True)

def SiCliqueaBoton(self,event):
self.etiqueta.SetLabel(self.entrada.GetValue() + "Cliqueo el boton!")
self.entrada.SetFocus()
self.entrada.SetSelection(-1,-1)

def SiPulsaEnter(self,event):
self.etiqueta.SetLabel(self.entrada.GetValue() + "Pulso enter!")
self.entrada.SetFocus()
self.entrada.SetSelection(-1,-1)

if __name__ == "__main__":
app = wx.App()
frame = simpleapp_wx(None,-1,'Mi aplicacion')
app.MainLoop()

Conclusiones

Bueno, eso es todo, espero que les sirva, si encuentran errores por favor me avisan asi lo corrijo. El documento es de libre distribucion, solo me gustaria que se mantenga la autoria, pero, si no lo quiere hacer tambien esta bien, la unica motivacion es compartir conocimientos.

Si quieren profundizar en el uso de wxPython recomiendo los siguientes enlaces:

http://www.wxpython.org/onlinedocs.php

http://wiki.wxpython.org/

http://boa-constructor.sourceforge.net/

Fuente: http://www.retronet.com.ar *Luis Tomas Wayar*


5 síntomas de pereza informática y sus remedios

Desorden y caos informáticosUn ordenador es como una casa. Bueno, no exactamente, pero el símil sirve para introducir un problema frecuente: el caos informático. Un equipo desorganizado se reconoce en seguida por la acumulación de iconos, el proliferar de molestos pop-ups, la presencia de docenas de barras y complementos, etcétera.

Todo esto, no sólo queda feo, sino que disminuye la comodidad del trabajo diario.  En este artículo, hablaremos de los cinco signos más frecuentes de pereza informática y de las soluciones que puedes poner en práctica para hacerles frente. Venga, ¡a limpiar!

1.  Toneladas de iconos en el Escritorio

El Escritorio es tan simpático, siempre ahí cuando necesitas tener algo a mano. ¿Tienes que descomprimir una cosa? Al Escritorio. ¿Te acaban de pasar unas fotos? Al Escritorio. ¿Creas accesos directos donde no toca? Al Escritorio irán.

El problema es que, según el tiempo pasa, este espacio se va llenando de más y más pequeños iconos hasta que resulta imposible encontrar nada. ¿Cuál es su utilidad entonces?

Escritorio repleto de iconos

Posibles soluciones:

  • Descomprimir archivos temporales en una carpeta ad-hoc. Por ejemplo C:\Temp
  • Utilizar el Asistente de Limpieza de Escritorio para borrar los accesos directos no utilizados últimamente. Lo encuentras en Propiedades de pantalla / Escritorio / Personalizar Escritorio / Limpiar Escritorio ahora.
  • Usar un programa como Fences o un dock
  • Configurar el navegador para que baje los ficheros a una carpeta (p.ej. "Descargas")

2. Superpoblación en la Bandeja del Sistema

Tener muchos iconos en la Bandeja del sistema no es algo malo de por sí. Lo malo es la causa que lleva a esta situación, la cual no es otra que infinidad de programas en memoria.

Posibles soluciones:

  • Eliminar del arranque programas innecesarios. Por ejemplo, con System Tray Cleaner
  • Configurar individualmente los programas para que no se muestren aquí
  • Ocultar los iconos que no usas modificando las Propiedades de la Barra de Tareas

3. Atracón de barras de herramientas en Internet Explorer

"Se me instaló sola y no sé como quitarla". ¿Cuántas veces habremos oído eso en boca de algún amigo con más barras de herramientas de las que cualquier humano podría desear?  En verdad, lo que quieren decir es "Soy demasiado vago para intentar desinstalarla".

Posibles soluciones:

  • Desinstalar las barras que no quieres. Algunas se encuentran en Agregar o Quitar programas. Otras se pueden desinstalar desde el menú Ayuda de la propia barra. En el futuro, evita el "SiguienteSiguiente" al instalar
  • Prueba utilidades como Toolbar Uninstaller o WhatInStartup
  • Usa otro navegador gratuito, como Firefox, Opera o Chrome

4. Menú contextual como la bolsa de Mary Poppins

El menú contextual del Explorador es nuestro amigo, pero tiene el feo vicio de acoger menús y submenús de todas las aplicaciones a las que les gusta integrarse con el sistema. A diferencia de los iconos en el Escritorio, la mayoría de instaladores dan por sentado que al usuario le apetecerá tener un atajo más al hacer clic con el botón derecho del ratón.

Menú contextual superpoblado

Posibles soluciones:

  • Usa ShellMenuView, Context Menu Editor o MenuMaid para eliminar ítems inútiles
  • Abre el Editor de registro (Inicio > Ejecutar > regedit.exe o Win+R) y navega hasta HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers. Borra los que no te interesan y reinicia el equipo
  • Las opciones de algunos programas permiten modificar o desactivar la integración con el Explorador

5. Más avisos que los de un panel de una central nuclear

Otro síntoma bastante molesto es la aparición de ventanas de aviso o recordatorios de que determinado producto ha caducado. El problema es que este tipo de avisos suelen tener la opción de "revisarlos más tarde", por lo que se van dejando y dejando hasta que al final te das cuenta de que, por no prestarle atención durante un minuto el primer día, has estado cerrando la ventana durante meses.

Posibles soluciones:

  • Desinstala los programas OEM preinstalados. Para ello, te recomendamos The PC Decrapifier y AppRemover
  • No instalar la actualización Notificaciones de Ventajas de Windows Original. Si lo haces, prueba a quitarla con RemoveWGA o alguna herramienta similar
  • Avisos o asistentes de primer uso (como el de IE):  no posponerlo indefinidamente
  • Si el programa te gusta, ¿por qué no comprarlo? ;-)

¿Tienes alguno u otro de estos síntomas de "dejadez computacional"? ¿Se te ocurren más soluciones a los problemas mencionados?


FUENTE: http://es.onsoftware.com