31 dic. 2009

Desarrollo de aplicaciones gráficas con python+gtk+glade. Parte 8. Calendario

Este tutorial trata sobre el uso del widget calendario, como capturar la fecha al dar clip y mostrarla en la misma ventana.
La figura muestra el diseño de la aplicación

A continuación se muestra el código de la aplicación:


#!/usr/bin/env python
# -*- coding: utf-8 -*-


import gtk, time

class App:
def __init__(self):
#Manejo del archivo glade por medio de gtkbuilder
self.glade_file = "ej8.ui"
self.glade = gtk.Builder()
self.glade.add_from_file(self.glade_file)
# cargar los widgets de la interfaz
self.window = self.glade.get_object('window1')
self.button1 = self.glade.get_object('button1')
self.button2 = self.glade.get_object('button2')
self.calendario = self.glade.get_object('calendar1')
self.label1 = self.glade.get_object('label1')
self.label2 = self.glade.get_object('label2')
self.label3 = self.glade.get_object('label3')
self.label4 = self.glade.get_object('label4')
#Asociar los eventos de los 2 botones y de la ventana
self.window.connect("destroy",self.on_window1_destroy)
self.button1.connect ("clicked",self.on_button1_clicked)
self.button2.connect ("clicked",self.on_button2_clicked)
#Tupla que maneja los meses del año
self.meses = ('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre')
#Se muestra todos los widgets
self.window.show_all()

def on_window1_destroy(self,*args):
#Cerrar aplicación
gtk.main_quit()

def on_button1_clicked(self,*args):
#Cerrar Aplicación
gtk.main_quit()

def on_button2_clicked(self,*args):
#Capturar los datos del calendario y presentarlos en las etiquetas
agno, mes, dia = self.calendario.get_date()
texto_agno = "Año: %s" %agno
texto_mes = "Mes: %s" %self.meses[mes]
texto_dia = "Dia: %s" %dia
self.label2.set_text(texto_agno)
self.label3.set_text(texto_mes)
self.label4.set_text(texto_dia)

def main(self):
gtk.main()




if __name__ == "__main__":
app = App()
app.main()






En la siguiente figura se muestra la aplicación en funcionamiento:

25 dic. 2009

Desarrollo de aplicaciones gráficas con python+gtk+glade. Parte 7. Barra de progreso y boton biestado

Continuando con la serie de tutoriales sobre pygtk. Este trata del desarrollo de una sencilla aplicación que contiene una barra de progreso que avanzará cada segundo mostrando el tiempo el cual trancurre la barra de progreso. En este tutorial como se ejecuta un proceso que puede congelar la ventana se usará hilos para evitarlo, adicionalmente se muestra el uso de botones biestado para controlar la barra de progreso.

En la figura se muestra el diseño de la aplicación.

El código se muestra a continuación:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# sin ej6.py
#
# Copyright 2009 Ernesto Nadir Crespo Avila
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#Importar los módulos gtk, time, threading, thread, gobject
import gtk, time
import threading
import thread
import gobject
#Iniciando el hilo sin usarlo
gtk.gdk.threads_init()



#La clase App hereda threading.Thread
class App(threading.Thread):
def __init__(self):
#Método constructor, asociando los widgets
self.glade_file = "ej6.ui"
self.glade = gtk.Builder()
self.glade.add_from_file(self.glade_file)
self.window1 = self.glade.get_object('window1')
self.togglebutton1 = self.glade.get_object('togglebutton1')
self.button1 = self.glade.get_object('button1')
self.progressbar1 = self.glade.get_object('progressbar1')
self.new_val = 0.0
self.rango =60
#Definiendo el valor inicial de la barra de proceso, definiendo los saltos en 0.1
self.progressbar1.set_fraction(self.new_val)
self.progressbar1.set_pulse_step(0.1)
self.window1.connect("destroy",self.on_window1_destroy)
self.button1.connect('clicked', self.on_button1_clicked)
self.togglebutton1.connect('toggled',self.on_togglebutton1_toggled)
#Iniciando el hilo en el constructor
threading.Thread.__init__(self)

self.window1.show_all()




def __iteracion__(self):
#Iteración en segundos cambiando el valor en la barra de progreso.
for i in range(self.rango):
if self.togglebutton1.get_active() == True:
self.new_val = self.progressbar1.get_fraction() + 0.01
if self.new_val > 1.0:
self.new_val = 0.0
self.togglebutton1.set_active(False)
break
else:
time.sleep(1)
self.x = self.new_val*100
self.progressbar1.set_text("%s" %self.x)
self.progressbar1.set_fraction(self.new_val)
else:
return





def on_togglebutton1_toggled(self,*args):
#Si cambia el evento en el boton biestado se inicia la iteración entre los hilos.
variable = self.togglebutton1.get_active()
self.rango = 100
if variable == True:
lock = thread.allocate_lock()
lock.acquire()
thread.start_new_thread( self.__iteracion__, ())
lock.release()
else:
#Se detiene la barra de progreso
self.progressbar1.set_fraction(self.new_val)
self.progressbar1.set_text("%s" %self.x)
return




def on_window1_destroy(self,*args):
#Se cierra la aplicación
gtk.main_quit()

def on_button1_clicked(self,*args):
#Se cierra la aplicación al darle clip al boton salir.
gtk.main_quit()


def main(self):
#Inicia la aplicación
gtk.main()






if __name__ == '__main__':
app = App()
app.main()

En la siguiente figura se muestra la aplicación:

21 dic. 2009

Desarrollo de interfaz gráfica para la configuración de accesos rápidos de teclado para gconf

En el anterior artículo se mostró el desarrollo de una aplicación en python que configura vía línea de comandos los accesos rápidos de teclado para gnome por medio de gconf.

La interfáz gráfica de la aplicación la pueden bajar del siguiente enlace , el código python de la aplicación lo pueden bajar acá y el módulo configGconf.py .

La interfaz gráfica fue creada con glade usando gtkbuilder en vez de libglade, esa es una de las diferencias principales con otros desarrollos gráficos mostrados en este blog. La interfaz tiene varios botones de verificación para seleccionar cuales opciones de teclas rápidas se quieren configurar.
La siguiente figura muestra la interfaz desarrollada con glade.

A continuación el código fuente de la aplicación:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Name: pyconfig-accessgnome-uy
Description: Aplicación gráfica que permite configurar los accesos rápidos de teclado a gconf
Version:0.1
License: GPLv3
Copyright: Copyright (C) 2009 Libre Accesibilidad
Author: Ernesto Nadir Crespo Avila
Email: ecrespo@gmail.com

"""




#Importar módulo gtk y el módulo de cambios de opciones de teclado
import gtk,configGconf


#Clse AccessGnomeCOnfig
class AccessGnomeConfig:
def __init__(self):

#Uso de la interfaz desarrollada con gtkbuilder y llamado del mismo.
self.glade_file = "ui.glade"
self.glade = gtk.Builder()
self.glade.add_from_file(self.glade_file)
# Asociación de todos los widgets
self.window = self.glade.get_object('dialog1')
self.button1 = self.glade.get_object('button1')
self.button2 = self.glade.get_object('button2')
self.checkbutton1 = self.glade.get_object('checkbutton1')
self.checkbutton2 = self.glade.get_object('checkbutton2')
self.checkbutton3 = self.glade.get_object('checkbutton3')
self.checkbutton4 = self.glade.get_object('checkbutton4')
self.checkbutton5 = self.glade.get_object('checkbutton5')
self.checkbutton6 = self.glade.get_object('checkbutton6')
self.checkbutton7 = self.glade.get_object('checkbutton7')
self.checkbutton8 = self.glade.get_object('checkbutton8')
self.checkbutton9 = self.glade.get_object('checkbutton9')
self.checkbutton10 = self.glade.get_object('checkbutton10')
self.checkbutton11 = self.glade.get_object('checkbutton11')
self.checkbutton12 = self.glade.get_object('checkbutton12')
self.checkbutton13 = self.glade.get_object('checkbutton13')
self.aplicaciones = []



# asociar las señales de los widgets con los métodos de la clase
self.window.connect ("close",self.on_dialog1_close)
self.window.connect("destroy",self.on_dialog1_destroy)
self.button1.connect ("clicked",self.on_button1_clicked)
self.button2.connect ("clicked",self.on_button2_clicked)
self.checkbutton1.connect("toggled",self.on_checkbutton1_toggled)
self.checkbutton2.connect("toggled",self.on_checkbutton2_toggled)
self.checkbutton3.connect("toggled",self.on_checkbutton3_toggled)
self.checkbutton4.connect("toggled",self.on_checkbutton4_toggled)
self.checkbutton5.connect("toggled",self.on_checkbutton5_toggled)
self.checkbutton6.connect("toggled",self.on_checkbutton6_toggled)
self.checkbutton7.connect("toggled",self.on_checkbutton7_toggled)
self.checkbutton8.connect("toggled",self.on_checkbutton8_toggled)
self.checkbutton9.connect("toggled",self.on_checkbutton9_toggled)
self.checkbutton10.connect("toggled",self.on_checkbutton10_toggled)
self.checkbutton11.connect("toggled",self.on_checkbutton11_toggled)
self.checkbutton12.connect("toggled",self.on_checkbutton12_toggled)
self.checkbutton13.connect("toggled",self.on_checkbutton13_toggled)
#Configuración del widget ventana, agregandole un título.
self.window.set_title("Configuración de accesos rapidos de Aplicaciones en Gnome")
self.window.show_all()
#Métodos de utilización de los botones de verificación cuando se selecciona o no.
#Cuando se selecciona se agrega el elemento a una lista
#Cuando se deselecciona se elimina el elemento de la lista.
def on_checkbutton1_toggled(self,*args):
variable = self.checkbutton1.get_active()
if variable == True:
self.aplicaciones.append("orca")
else:
self.__eliminacion("orca")

def on_checkbutton2_toggled(self,*args):
variable = self.checkbutton2.get_active()
if variable == True:
self.aplicaciones.append("nautilus")
else:
self.__eliminacion("nautilus")

def on_checkbutton3_toggled(self,*args):
variable = self.checkbutton3.get_active()
if variable == True:
self.aplicaciones.append("oowriter")
else:
self.__eliminacion("oowriter")

def on_checkbutton4_toggled(self,*args):
variable = self.checkbutton4.get_active()
if variable == True:
self.aplicaciones.append("iceweasel")
else:
self.__eliminacion("iceweasel")

def on_checkbutton5_toggled(self,*args):
variable = self.checkbutton5.get_active()
if variable == True:
self.aplicaciones.append("pidgin")
else:
self.__eliminacion("pidgin")

def on_checkbutton6_toggled(self,*args):
variable = self.checkbutton6.get_active()
if variable == True:
self.aplicaciones.append("gedit")
else:
self.__eliminacion("gedit")

def on_checkbutton7_toggled(self,*args):
variable = self.checkbutton7.get_active()
if variable == True:
self.aplicaciones.append("ooimpress")
else:
self.__eliminacion("ooimpress")

def on_checkbutton8_toggled(self,*args):
variable = self.checkbutton8.get_active()
if variable == True:
self.aplicaciones.append("gnome-calculator")
else:
self.__eliminacion("gnome-calculator")

def on_checkbutton9_toggled(self,*args):
variable = self.checkbutton9.get_active()
if variable == True:
self.aplicaciones.append("oocalc")
else:
self.__eliminacion("oocalc")

def on_checkbutton10_toggled(self,*args):
variable = self.checkbutton10.get_active()
if variable == True:
self.aplicaciones.append("rhythmbox")
else:
self.__eliminacion("rhythmbox")

def on_checkbutton11_toggled(self,*args):
variable = self.checkbutton11.get_active()
if variable == True:
self.aplicaciones.append("gnome-terminal")
else:
self.__eliminacion("gnome-terminal")

def on_checkbutton12_toggled(self,*args):
pass
"""
variable = self.checkbutton12.get_active()
if variable == True:
print "daltonicos"
else:
print "nada de daltonicos"
"""
def __eliminacion(self,aplicacion):
#Elimina un elemento de la lista
if len(self.aplicaciones) >= 2:
for i in range(len(self.aplicaciones)):
if self.aplicaciones[i] == aplicacion:
self.aplicaciones[i:i+1] = []
break
else:
continue
elif len(self.aplicaciones) == 1:
if self.aplicaciones[0] == aplicacion:
self.aplicaciones = []
else:
pass
else:
pass


def on_checkbutton13_toggled(self,*args):
#Selecciona todos los botones de verificación o los deselecciona a todos.
variable = self.checkbutton13.get_active()
if variable == True:
self.checkbutton1.set_active(1)
self.checkbutton2.set_active(1)
self.checkbutton3.set_active(1)
self.checkbutton4.set_active(1)
self.checkbutton5.set_active(1)
self.checkbutton6.set_active(1)
self.checkbutton7.set_active(1)
self.checkbutton8.set_active(1)
self.checkbutton9.set_active(1)
self.checkbutton10.set_active(1)
self.checkbutton11.set_active(1)
#self.checkbutton12.set_active(1)
else:
self.checkbutton1.set_active(0)
self.checkbutton2.set_active(0)
self.checkbutton3.set_active(0)
self.checkbutton4.set_active(0)
self.checkbutton5.set_active(0)
self.checkbutton6.set_active(0)
self.checkbutton7.set_active(0)
self.checkbutton8.set_active(0)
self.checkbutton9.set_active(0)
self.checkbutton10.set_active(0)
self.checkbutton11.set_active(0)
#self.checkbutton12.set_active(0)


def on_dialog1_close(self,*args):
#Cierra la ventana de dialogo
gtk.main_quit()

def on_dialog1_destroy(self,*args):
#Cierra la ventana de dialogo
gtk.main_quit()

def on_button1_clicked(self,*args):
#Cierra la ventana de dialogo
gtk.main_quit()

def on_button2_clicked(self,*args):

#Llama al módulo configGconf para aplicar los cambios con gconf

Config = configGconf.Conf()
Config.modificar_opcion(self.aplicaciones)

def main(self): #Método que ejecuta el programa
gtk.main()




if __name__ == "__main__":
Instancia del objeto AccessGnomeConfig y ejecución del programa

app = AccessGnomeConfig()
app.main()


La opción de applet para daltónicos no está habilitada en este momento ya que se está trabajando en agregar el applet automaticamente a la barra superior de gnome por medio de gconf. La próxima mejora será eliminar configuraciones del gconf.

En próximo artículo se creará el paquete .tar.gz de python para subirlo al repositorio oficial de python y luego crear un paquete para debian.

11 dic. 2009

Script en python que configura los accesos rápidos de teclado a aplicaciones en gnome con gconf

El script lo pueden bajar de googlecode .
Este programa tiene su ayuda:
./pyconfig-accessgnome.py --help
pyconfig-orca options
option : --help : Print this help
option : --list : List gconf for gnome-orca
option : --all : add all config access key in gconf
option : --nautilus : add gconf access key to nautilus
option : --gnome-terminal : add gconf access key to gnome-terminal
option : --oowriter : add gconf access key to oowriter
option : --pidgin : add gconf access key to pidgin
option : --gedit : add gconf access key to gedit
option : --gnome-calculator : add gconf access key to gnome-calculator
option : --ooimpress : add gconf access key to ooimpress
option : --oocalc : add gconf access key to oocalc
option : --rhythmbox : add gconf access key to rhythmbox
option : --orca : add gconf access key to orca
option : --iceweasel : add gconf access key to iceweasel

La opción --all permite configurar todas las opciones de una vez, también se puede configurar unas aplicaciones nada más.
./pyconfig-accessgnome.py --all
./pyconfig-accessgnome.py --pidgin --orca --iceweasel

El código del programa a continuación:

#!/usr/bin/env python
# -*- coding: utf-8 -*-


"""
Name: pyconfig-accessgnome
Description: Aplicación y módulo que permite modificar los accesos rápido de teclas a programas
Version:0.2
License: GPLv3
Copyright: Copyright (C) 2009 Libre Accesibilidad
Author: Ernesto Nadir Crespo Avila
Email: ecrespo@gmail.com
Changelog:
* Agregada multiples opciones de configuración

"""

import gconf


class Conf:
def __init__(self):
self.gconfClient = gconf.client_get_default()
self.aplicaciones = ("orca", "gnome-terminal","oowriter","iceweasel","nautilus","ooimpress","pidgin","oocalc","gedit","gnome-calculator","rhythmbox")
self.comando = "/apps/metacity/keybinding_commands/command_"
self.asignacion_teclado = "/apps/metacity/global_keybindings/run_command_"
self.teclas = {"orca":"o","gnome-terminal":"t","oowriter":"w","iceweasel":"n","nautilus":"h","ooimpress":"i","pidgin":"p","oocalc":"x","gedit":"e","gnome-calculator":"c","rhythmbox":"m"}
self.colorblind = {}

def modificar(self):
cont = 1
for aplicacion in self.aplicaciones:
ruta1 = "%s%s" %(self.comando,cont)
ruta2 = "%s%s" %(self.asignacion_teclado,cont)
self.gconfClient.set_string(ruta1, "%s" %aplicacion)
self.gconfClient.set_string(ruta2, "%s" %self.teclas[aplicacion])
cont = cont +1
def modificar_opcion(self,opciones_validas):
cont = 1
for aplicacion in opciones_validas:
if aplicacion in self.aplicaciones:
ruta1 = "%s%s" %(self.comando,cont)
ruta2 = "%s%s" %(self.asignacion_teclado,cont)
self.gconfClient.set_string(ruta1, "%s" %aplicacion)
self.gconfClient.set_string(ruta2, "%s" %self.teclas[aplicacion])
cont = cont +1
else:
print "please change this option: %s" %aplicacion
def listar(self):
cont = 1
for aplicacion in self.aplicaciones:
ruta1 = "%s%s" %(self.comando,cont)
ruta2 = "%s%s" %(self.asignacion_teclado,cont)
print self.gconfClient.get_string(ruta1),self.gconfClient.get_string(ruta2)
cont = cont +1


if __name__ == "__main__":
import sys
config = Conf()
global opciones
opciones = config.teclas.keys()
def mensaje():
print "pyconfig-orca options "
print "option : --help : Print this help"
print "option : --list : List gconf for gnome-orca"
print "option : --all : add all config access key in gconf"
for opcion in opciones:
print "option : --%s : add gconf access key to %s" %(opcion,opcion)
if len(sys.argv) == 1 :
mensaje()
elif len(sys.argv) == 2:
if sys.argv[1] == "--list" :
config.listar()
elif sys.argv[1] == "--all":
config.modificar()
elif sys.argv[1] == "--help" :
mensaje()
else:
for opcion in opciones:
if sys.argv[1] =="--%s" %opcion:
config.modificar_opcion(opcion)
elif len(sys.argv) > 2:
bandera = 0
opciones_validas = []
for opcion in sys.argv[1:]:
if opcion == "--list" :
bandera = 1
continue
elif opcion == "--all":
bandera = 1
continue
elif opcion == "--help":
bandera == 1
continue
else:
opciones_validas.append(opcion[2:])
if bandera == 1:
mensaje()
print "If you have a two option or more, please don\'t use --list,--all or --help."
else:
config.modificar_opcion(opciones_validas)
print "all change do it"



En próximo post se mostrará la interfaz gráfica para la aplicación.

AddThis