lunes, 9 de abril de 2007

Artículos de Python + Glade en Español

Para aquell@s gentes que están incursionando en el mundo de la programación, el lenguaje Python es ideal para aprender. Y es normal que las primeras cosas que se quieran hacer sean ventanas con botones, menúes y demás. GTK es una librería que permite hacer eso para varias plataformas, como Windows, Linux, Solaris y Mac OSX (con problemas de integración, pero funciona). Por último, Glade es un programa que sirve para crear las ventanas+botones+menúes+etc. de forma gráfica, "dibujando", arrastrando y pegando componentes en una suerte de "vista de diseño" (al mejor estilo Visual Basic o Delphi).

LearningPython.com es un sitio en idioma inglés donde hay tutoriales varios sobre este lenguaje, aquí les dejo un blog donde hay artículos traducidos al castellano de Python + GTK + Glade.

Parte 1: Creando una GUI usando PyGTK y Glade
Parte 2: Construyendo una aplicación con PyGTK y Glade
Parte 3:Extendiendo nuestra aplicación PyGTK

Saludos!
Marcelo

5 comentarios:

Lord Taran dijo...

No soy precisamente un experto en Glade ni en gtk, y mientras aprendo estoy traduciendo, pues así llego más a fondo, o eso me parece a mi. Por supuesto tampoco soy precisamente un traductor profesional... Así que es más que probable que encontréis fallos en las traducciones.
Si fuera así agradecería que me las notificarais.

Marcelo dijo...

Sólo para decirte que te felicito por el trabajito que te tomaste. :-D

Marcelo

Lord Taran dijo...

Solo hace falta que le sirva a alguien y no sólo a mi, y pulirlo claro ;)
Por cierto, gracias a tu referencia he conocido y agregado a mi blogroll Codear.com, muy interesante!

Pilar dijo...

Hola, no sé si me podeis ayudar con esto de python y glade.
Estoy intentando integrar unas ventanas hechas con glade en inkscape, en la parte de extensiones, pero cuando muestro la ventana se queda un poco petado el inkscape, hasta que la cierro. Y el menú se queda abierto hasta que cierre la ventana de glade, evidentemente estoy haciendo algo mal, pero no sé como integrarlo para que funcione, aqui os mando mi codigo por si me podeis ayudar,llevo días con ello y no veo como arreglarlo
#!/usr/bin/env python
# -*- coding: UTF8 -*-

# Python module senialUpdate.py
# Autogenerated from senialUpdate.glade
# Generated on Sat Mar 29 18:40:21 2008

# Warning: Do not delete or modify comments related to context
# They are required to keep user's code

try:
import os
import sys
import gtk
import gtk.glade
except ImportError:
print "Error importing pygtk2 and pygtk2-libglade"
sys.exit(1)


from xml.dom import minidom, Node
import optparse, simplestyle, inkex, simplepath,pturtle

import xml.xpath

import random

# Put your modules and data here

# From here through main() codegen inserts/updates a class for
# every top-level widget in the .glade file.

class Senial(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self,use_minidom=True)
self.__acels= gtk.AccelGroup()

gladefile="/usr/local/share/inkscape/extensions/senialUpdate.glade"
self.windowname="senial"
self.wTree= gtk.glade.XML(gladefile)
self.wTree.signal_autoconnect(self)
self.VPrincipal= self.wTree.get_widget("senial")
self.VPrincipal.show()


dic = {"on_bAplicar_button_press_event" : self.on_bAplicar_button_press_event,
"on_bAceptar_button_press_event" : self.on_bAceptar_button_press_event,
"on_bCancelar_button_press_event" : self.on_bCancelar_button_press_event,
"on_cbColorValor_changed" : self.on_changeCValor,
"on_senial_destroy": gtk.main_quit}
self.wTree.signal_autoconnect(dic)



def effect(self):


t = pturtle.pTurtle()
t.pu()
t.setpos(self.view_center)
t.pd()

if len(self.selected)==0:
print "Ningun elemento seleccionado"

else:

for id,node in self.selected.iteritems():
self.getAttribs(node)


#context Senial custom methods {
#--- Write your own methods here ---#
#context Senial custom methods }
def getAttribs(self,node):
EtiquetaText= self.wTree.get_widget("tEtiqueta")
IdentText= self.wTree.get_widget("tIdent")
spNumDecimalesText= self.wTree.get_widget("spNumDecimales")
spTamLetraText= self.wTree.get_widget("spTamLetra")
spValMaxText= self.wTree.get_widget("spValMax")
spValMinText= self.wTree.get_widget("spValMin")
spDistancia1Text= self.wTree.get_widget("spDistancia1")
spDistancia2Text= self.wTree.get_widget("spDistancia2")
cbColorNombreUniText= self.wTree.get_widget("cbColorNombreUni")
cbColorValorText = self.wTree.get_widget("cbColorValor")

sId=''
sName=''
sTag=''
sVMax=''
sVMin=''
sColorDefecto=''
sNDecimales=''
sEstilo=''
#if (node.nodeType == Node.ELEMENT_NODE):
if (node.hasAttributes()):
if (node.getAttribute('id')!= None):
sId = node.getAttribute('id')
if (node.getAttribute('Name')!=None):
sName = node.getAttribute('Name')
EtiquetaText.set_text(node.getAttribute('Name'))
#node.setAttribute('Name','cambiaya')

if (node.attributes.getNamedItem('Tag')!=None):
sTag = node.getAttribute('Tag')
IdentText.set_text(sTag)
if (node.attributes.getNamedItem('VMax')!= None):
sVMax = node.attributes.getNamedItem('VMax').value
spValMaxText.set_text(sVMax)
if (node.attributes.getNamedItem('VMin')!=None):
sVMin = node.attributes.getNamedItem('VMin').value
spValMinText.set_text(sVMin)
if (node.attributes.getNamedItem('ColorDefecto')!= None):
sColorDefecto = node.attributes.getNamedItem('ColorDefecto').value
'''
if (sColorDefecto== "white"):
#pos= color.get_item()
cbColorValorText.set_active(5)
'''
if (node.attributes.getNamedItem('ColorNombreUni')!= None):
sColorNombreUni= node.attributes.getNamedItem('ColorNombreUni').value
#Falta por cambiar este color

if (node.attributes.getNamedItem('NDecimales')!= None):
sNDecimales= node.attributes.getNamedItem('NDecimales').value
spNumDecimalesText.set_text(sNDecimales)
if (node.attributes.getNamedItem('tamLetra')!= None):
sTamLetra= node.attributes.getNamedItem('tamLetra').value
ftamLetra= float(sTamLetra)
spTamLetraText.set_value(ftamLetra)
if (node.attributes.getNamedItem('style')!= None):
sEstilo= node.attributes.getNamedItem('style')
IdentText.set_text('cogido Estilo')






def setAttribs(self,node):
EtiquetaText= self.wTree.get_widget("tEtiqueta")
IdentText= self.wTree.get_widget("tIdent")
spNumDecimalesText= self.wTree.get_widget("spNumDecimales")
spTamLetraText= self.wTree.get_widget("spTamLetra")
spValMaxText= self.wTree.get_widget("spValMax")
spValMinText= self.wTree.get_widget("spValMin")

sId=''
sName=''
sTag=''
sVMax=''
sVMin=''
sColorDefecto=''
sNDecimales=''
sEstilo=''

if node.hasAttributes():


node.setAttributeNS(None,'Name','cambiaya2')
node.setAttribute('typeElement','tipo')

IdentText.set_text(node.getAttribute('typeElement'))


def on_bAplicar_button_press_event(self, widget, *args):
for id,node in self.selected.iteritems():
self.setAttribs(node)


def on_bAceptar_button_press_event(self, widget, *args):
#context Senial.on_bAceptar_button_press_event {
#print "on_bAceptar_button_press_event called with self.%s" % widget.get_name()
#context Senial.on_bAceptar_button_press_event }
self.setAttrib2()
gtk.main_quit()



def on_bCancelar_button_press_event(self, widget, *args):
#context Senial.on_bCancelar_button_press_event {
#print "on_bCancelar_button_press_event called with self.%s" % widget.get_name()
gtk.main_quit()
#self.quit()
#context Senial.on_bCancelar_button_press_event }

def on_changeCValor (self, widget, *args):
s = self.wTree.get_widget('cbColorValor').get_children()[0].get_text()
print 'color ha cambiado %s' %s




if __name__ == "__main__":
hwg= Senial()
hwg.affect()
gtk.main()

Marcelo dijo...

Bueno, Pilar, se me hace una duda un poco larga (y eso que estoy con poco tiempo)... te invito a que la postees en la lista de correo de Python Argentina, ahí te van (vamos?) a contestar todas las dudas que tengas al respecto. :-)

Saludos!
Marcelo