Vamos a hacer un pequeño programa con PyGTK 3.0 que también funciona para PyGTK 3.4. Esta pequeña GUI les enseñara como dividir un programa en dos a mas archivos.
Ustedes pueden visitar el tutorial de Sebastian Pölsterl sobre el nuevo PyGTK 3, aquí esta el nuevo tutorial, les dejo el link :
http://python-gtk-3-tutorial.readthedocs.org/en/latest/index.html
Este es el blog de Sebastian .
Una critica a este tutorial de Sebastian es que no enseña a dividir un programa en partes o en varios archivos, hubiera sido bueno que mostrara un ejemplo de como hacerlo con PyGTK 3.
Todos los programas grandes y complejos se dividen en muchos archivos e incluso los archivos se colocan en otros directorios, es decir se ubican en diferentes carpetas.
Comencemos con el pequeño ejemplo:
Aquí les dejo el código del escrito en un solo archivo llamado gui.py. Abrimos el editor de texto Gedit o el editor que mas usemos, copiamos el codigo de abajo y lo guardamos como gui.py
from gi.repository import Gtk class gui(): def on_open_clicked(self, button): print "\"Open\" button was clicked" def on_close_clicked(self, button): print "Closing application" Gtk.main_quit() def __init__(self): self.window = Gtk.Window() self.window.connect('delete-event', Gtk.main_quit) self.box = Gtk.Box() self.window.add(self.box) self.button = Gtk.Button(label='Open') self.button.connect("clicked", self.on_open_clicked) self.box.pack_start(self.button, True, True, 0) self.button = Gtk.Button(label='Cerrar') self.button.connect("clicked", self.on_close_clicked) self.box.pack_start(self.button, True, True, 0) self.window.show_all() Gtk.main() if __name__ == '__main__': gui = gui()
def on_open_clicked(self, button): print "\"Open\" button was clicked"
Es una función que se activa en el terminal cuando hacemos clic en el botón open. La señal para activarla es:
self.button.connect("clicked", self.on_open_clicked) def on_close_clicked(self, button): print "Closing application" Gtk.main_quit()
es una función que se activa cuando hacemos clix en el boton cerrar .
cierra el programa que ejecutamos .
la señal para activarla es
self.button.connect("clicked", self.on_close_clicked) from gi.repository import Gtk ### invocamos a las librerías de PyGTK ### class gui(): ### definición de clase llamada gui es la clase principal ###
Declaración de Widgets: un widgets es un programa predeterminado por las librerías de interfaz gráfica que usamos. Por ejemplo un widgets es un botón, una ventana, una caja, etc. Estos son los widgets que declaramos en nuestra programa .
self.window = Gtk.Window() ### ventana ### self.box = Gtk.Box() ### caja #### self.button = Gtk.Button(label='Open') #### boton open #### self.button = Gtk.Button(label='Cerrar') #### boton cerrar #### self.window.add(self.box) #### la caja esta contenida en la ventana llamada window #### self.box.pack_start(self.button, True, True, 0) ##### el boton esta contenido en la caja llamada box ### self.window.show_all() ### mostramos toda la ventana ### gui = gui() ### creo un objeto gui ####
Colocamos nuestro programa en una carpeta llamada simple en nuestro caso en el escritorio
Abrimos la carpeta con el terminal , en mi caso uso Nemo de Linux Mint 14 .
Para compilar colocamos en el terminal python gui.py
ver la imagen .
Ahora podemos ver nuestro pequeño programa o widget nuevo creado con las librerias PyGTK 3
Se trata de una simple ventana con dos botones .
Ahora dividimos el programa en tres partes a continuación les dejo el código de los tres archivos .
Primer archivo gui.py
from gi.repository import Gtk from destroy import destroy from io import io class gui(destroy ,io ): def __init__(self): self.window = Gtk.Window() self.window.connect('delete-event', Gtk.main_quit) self.box = Gtk.Box() self.window.add(self.box) self.button = Gtk.Button(label='Open') self.button.connect("clicked", self.on_open_clicked) self.box.pack_start(self.button, True, True, 0) self.button = Gtk.Button(label='Cerrar') self.button.connect("clicked", self.on_close_clicked) self.box.pack_start(self.button, True, True, 0) self.window.show_all() Gtk.main() if __name__ == '__main__': gui = gui()
Segundo archivo io.py
class io: def on_open_clicked(self, button): print "\"Open\" button was clicked"
Tercer archivo destroy.py
from gi.repository import Gtk class destroy: def on_close_clicked(self, button): print "Closing application" Gtk.main_quit()
Colocamos los tres archivo en una misma carpeta en nuestro caso , la carpeta se llama simple dividido .
Para compilar los tres archivos . Abrimos la carpeta con el terminal y simplemente colocamos de nuevo en el terminal
python gui.py
Modificaciones realizadas al codigo gui.py
from destroy import destroy ### sentencia para importar nuestro archivo destroy.py ### from io import io ### sentencia para importar nuestro archivo io.py ### class gui(destroy ,io ): #### ala clase principal le añadimos las subclases destroy e io ####
Pueden observar que la sentencia
def on_open_clicked(self, button): print "\"Open\" button was clicked"
no esta en gui.py, se encuentra en el archivo io.py
La sentencia
def on_close_clicked(self, button):
print «Closing application»
Gtk.main_quit()
se encuentra en el archivo destroy.py
Así podemos dividir un programa en muchos archivos ubicados en diferentes directorios a la vez.
Por otra parte Python es un pilar del software libre, y esta adaptado para funcionar con GTK 3.6 /3.8 su denominación es PyGTK. La adaptación de Python para KDE se denomina PyQT.
Python esta adaptado para Mac OS y WINDOWS .
Espero que les haya sido útil este mini tutorial de PyGTK3. Pueden hacer todas las criticas constructivas que quieran.
También se algo de Gtk 3.4 /3.6 y Vala GTK 3.4/3.6.
http://www.youtube.com/watch?v=9ckRn_sx8CE
Por ultimo disculpen los usuarios de KDE por no realizar un mini tutorial para KDE .
yo en kde prefiero usa kdevelop (creo que asi se llama) para crear la gui a gusto pero aun me cuesta encontrar los procesos para que suceda x cosa :'(
Genial para los que usamos Python :D!
Saludos!
Hola llevo mucho tiempo siguiendo esta comunidad y no estoy muy seguro de si esta es la primera vez que comento o ya lo hice antes 😀 (no soy muy dado a escribir comentarios en la web la verdad). La cosa es que lo hago para dejar una sugerencia a Elav y KZKG^Gaara como administradores, y es que pienso que sería bueno idea añadir un plugin para coloreado de sintaxis ahora que últimamente veo más posts con código en diferentes lenguajes de programación. Se que existen bastantes plugins pero no he probado ninguno al no ser usuario de wordpress, así que os dejo que penséis en la viabilidad de las petición. Aprovecho para preguntar al resto de lectores que les parece la idea, pues se que hay por ahí gente que prefiere leer el código sin adorno alguno. Pido perdón si ya se había comentado esto por aquí y se rechazó por algún motivo, pues no recuerdo haber visto discusión sobre el tema.
La verdad me gustaria tener la opcion de colorear la sintaxis para resaltar el codigo de los lenguajes de programacion .
Eso ayudaria a los usuarios que quieran aprender los lenguajes de programacion.
Pero bueno yo igualmente estoy comodo con el foro y que podamos discutir y aprneder entre todos .
Más cómodo es GNU Emacs, pues al menos tienes para escoger en qué corrector de lenguaje de programación quieres trabajar (si no quieres más peso para tu procesador, usa GNU Nano y disfruta del minimalismo en su máxima expresión).
Elio estamos hablando de Worpress . Implementado en el blog Desde Linux. No tiene las funciones para dar color a las letras de los posteos .
Ah, disculpa.
Naaa emacs es cómodo para quien tiene 84 dedos XD.., la gente normal, textmate, sublimetext o notepad++ xd
Lo inverosímil es no haber aprendido mecanografía, el cual se exige para manejar bien GNU Emacs y sus atajos de teclado. Además, su GUI te facilita usar sus menús (se puede usar en Windows, pero no es recomendable hacerlo con el modo normal sino con el modo símbolo de sistema para que el win32 no boicotee tu script).
Muy chulo el tutorial. Pero, por cierto, el código fuente de python no se compila, es un lenguaje interpretado.
Se puede compilar a pseudo código. No es lenguaje de máquina sino bytes que representan algo para el intérprete, pero el proceso se llama compilado también. En tal sentido sí es posible decir que se compila algo.
Tal vez es mejor aprender pytgk2 debido a que la ultima versión disponible para Windows es la 2.24. La serie 3 brilla por su ausencia. Y Las malas lenguas dicen que gnome rompe todas las apis en cada versión nueva.
Yo programa mockup con GTK 3.4 / 3.6 y la verdad te rompen la paciencia y la cabeza , tienes que reescribir el código , ahora comprendo por que los de Linux Mint se quejan de GTK y el proyecto GNOME .
A los de MINT les doy la razón con GTK 2.4 esto no sucedía .
Buen tutorial y referencias.
Sólo un detalle, ya que se ha puesto código, en Python las identaciones son obligatorias y deberías respetarse en el código de ejemplo.
Saludos!
¿Puedes explicar en que consiste las identificaciones obligatorias en Python?.Te digo la verdad nunca habia escuchado eso .Es que estoy mal acostumbrados en los foros de PyGTK 2/3 en ingles y tal vez lo pase por alto.
En Python no se usan llaves como en C o bloques begin/end como en Pascal sino que todo se entiende a través de la indentación que le des al código. Es decir, los bloques se reconocen por estar indentados. Es una característica que, a mí particularmente, me encanta. Se evita uno el estar escribiendo llaves y cosas así.
A mi justo eso no me gusta, me parece más simple poner dos llavecitas o un std::endl;, que el estar viedo si está bien tabulada la linea xd
:p te va a poner un 0 tu profe de programacion. O peor te van a despedir del trabajo. Lo que mas importa es que el codigo sea legible con todo lo que eso implica
acabando con con llaves de cierre, se me hace mucho más legible XD..
En serio???
int main(int argc, char *argv[]){program_name = argv[0];while ((argc > 1) && (argv[1][0] == '-')) {switch (argv[1][1]) {case 'v':verbose = 1; break;case 'o':out_file = &argv[1][2];break;case 'l':line_max = atoi(&argv[1][2]);break;default:fprintf(stderr,"Bad option %s\n", argv[1]);usage();}++argv;--argc;} if (argc == 1) {do_file("print.in");} else {while (argc > 1) {do_file(argv[1]);++argv;--argc;}}return (0);}
Ves? Sin las indentaciones no se entiende muy bien. Y ese es uno fácil. Con uno más complejo sólo el compilador lo entiende. La cosa es que ya que de todas formas TIENES que indentar (para que los humanos entiendan el código) por qué habría que ser redundante y usar separadores? Basta con indentar y ya.
Claro que no se entiende nada, porque no estás respetando las reglas de buena escritorua de un programa en c/c++. Eso que hicistes vale para cualquier cosa, como anidar una una fncion, dentro de una función dentro otra función que está dentro de otra, luego quiero verte xd si eres capaz de entenderlo.
por cierto, con dos miradas, ese codigo es fácilmente entendible xD
Eso que hice lo hice adrede para demostrarte que sin indentación, a pesar de que compila, es sumamente difícil entender cualquier código. Entonces tienes 2 reglas: Indentar y englobar con delimitadores. Pero eso es redundante. En Python un código así simplemente no es aceptado por el intérprete. Y sólo tienes una regla: Indentar. Fácil.
Pero bueno, cada quien con sus gustos.
Ambos son buenos,los identados y los no identados,en mi opinión prefiero los de estilo punto y coma o como ruby,similar a python pero no es necesaria la sangria.
Así se entiende mas :P:
echo ‘int main(int argc, char *argv[]){program_name = argv[0];while ((argc > 1) && (argv[1][0] == ‘-‘)) {switch (argv[1][1]) {case ‘v’:verbose = 1; break;case ‘o’:out_file = &argv[1][2];break;case ‘l’:line_max = atoi(&argv[1][2]);break;default:fprintf(stderr,»Bad option %s\n», argv[1]);usage();}++argv;–argc;} if (argc == 1) {do_file(«print.in»);} else {while (argc > 1) {do_file(argv[1]);++argv;–argc;}}return (0);}’ | perl -p -e ‘s/\{/\{\n\t/g;s/\;/\;\n\t/g;s/\t\}/\}/g;’
Saludos 😀
Creo que Carlos se refiere a que donde sale el código no hay indents. Eso con copy&paste simplemente no funcionará. No sé si al crear un post exista el tag
para meter código de lenguajes. Sería bueno que lo pusieran si no existe.
Ya vi cuál es el problema: el Tag CODE elimina todos los espacios y tabuladores (no debería hacer eso!!!) Pero si le ponen un nbsp entonces sí queda bien el código. A0 en hex (160 en dec) aunque creo que podría depender del font (no lo sé). Si se usa entonces sale así:
def fib(n):
a, b = 0, 1
while a < n:
print(a)
a, b = b, a+b
Que en mis pruebas se ve bien, pero no tengo un preview al postear respuestas (y debería haber eso!!!) Si no sale no es culpa mía 😉
Mira los ejemplos que pone Sebastian Pölsterl en su tutorial de PyGTK 3 , Sebastian no coloca etiquetas .
Ejemplo :
http://python-gtk-3-tutorial.readthedocs.org/en/latest/entry.html#example
puedes ver todo el tutorial de Sebastian .
No sé a qué te refieres. Lo que yo digo es que acá, en los posts, no es posible usar el Tag HTML «CODE» para que lo que pongas como código y salga bien indentado. En la página que remites, si ves las fuentes de la página, verás que no usa CODE pero usa otros delimitadores HTML.
No es contra el código que pusiste sino más bien haciendo notar una falla en el sistema de posts de este site. El cual, tal vez, puedan arreglar los admins.
Cuando hablo de etiquetas obviamente estoy hablando de HTML, no de Python. En todo caso, si metes código sin indentar en Python simplemente no funcionará. Si viene un novato y copia el codigo tal cual aparece en este post y lo intenta correr le va a fallar. Tal vez se frustre pues es novato. Una vez más, la culpa no es tuya; y en mi respuesta inmediata anterior lo que hice fue dar una forma de solventar el problema desde el nivel de usuario-que-postea.
Tenes toda la razón , tendría que haber subido fotos en vez de copiar el código .
para mostrar como se ordenan las sentencias adecuadamente en PyGTK 3.
Para programar con python recomiendo usar el Eclipse con el plugin PyDev, o el Pychar m
Como comenteban más arriba, justo por eso no me gusta python, por el tema de las identaciones. Como bien vimos, al hacer copy&paste no funcionará, lo cual no ocurre con otros lenguajes como C, Java, PHP, etc..
Lo de la legibilidad, aplicamos un embellecedor de códigos ( como http://indentcode.net/ ) y listo,
Lo de feo se arregla, pero si no hay identación y la lógica se altera, sonamos..
Soy nuevo en PyGTK, es posible interactuar con shell scripts en este lenguaje?
Gracias por el tutorial.
Saludos.