Una pequeña introducion a TCL/TK para hacer ventanas, formul

Post Reply
Message
Author
User avatar
mister_electronico
Posts: 969
Joined: Sun 20 Jan 2008, 20:20
Location: Asturias_ España
Contact:

Una pequeña introducion a TCL/TK para hacer ventanas, formul

#1 Post by mister_electronico »

Esto pretende ser un pequeño tutorial introductorio a comandos del TCL/TK y que esta principalmen
mente destinado a crear formularios para realizar programas, espero que no llegueis a pensar que son un entendido en la materia por ni por asomo lo soy, soy mas bien un zoquete y un poco vago, pero bueno si con esto le pica a alguien el gusanillo y le sirve para empezar y luego indagar un poco mas pues bien venido sea.

Empeze a indagar en ello cuando un dia probando ordenes desde el terminal de Puppy teclee la orden wish y me aparecio un formulario, y como yo he practicado con Visual Basic haciendo formularios pues me dije, debe haber alguna forma de crear botones, comandos y etc... y me puse a ello.

*Nota estos ejemplos se han sacado principalmente de la pagina web de la universidad Informatica de Oviedo y la direccion es http://www6.uniovi.es/tcl/tutorial/cap1.html para TCL
y para TK http://www6.uniovi.es/tcl/tutorial/cap10.html han sido adaptados para Puppy y en algun momento depurados para que pudieran funcionar bajo wish.

Decir que yo manejo la version 2.15 de Puppy pero creo que no habra ningun problema para otras versiones.

Asi que ahi va el primer ejemplo:

Creamos un fichero con extension tcl tal como: primer.tcl y le escribimos:


button .hola -text "Hola Mundo" -command {puts "Hola Mundo!!!"}
pack .hola -padx 60 -pady 60

button .boton2 -text "boton3"
pack .otroboton

button .boton3 -text "boton3"
pack .boton3

Luego una vez salvado el fichero nos debemos posicionar con sobre el icono del fichero y apretando el boton derecho del raton seleccionar, seleccionar la orden "Set run action" y dentro de la ventana que nos aparece "Enter a shell comand" escribir la orden wish "$1" salir apretando el boton:
"Use Command". Esto hara que los archivos sean con extension tcl sean ejecutados por tcl.
Ya solo nos queda hacer un click de raton sobre el icono del archivo en Rox y nos aparecera la ventanita:

Image


Bueno hemos echo un formulario con 3 botones que es muy bonito pero sirve de poco, vamos ha ejecutar alguna orden.

Para ello creamos otro fichero que boton_comando.tcl en el que escribiremos los siguiente:

## Creamos una ventaa con un boton que cuando se aprieta se cierra la ventana

# Creamos el formulario con el tamaño adecuado
frame .body -width 300 -height 250
pack .body


# Creamos el boton de salir y lo colocamos abajo en la parte izquierda.

button .salir -text "Salir" -command "destroy ." -relief raise
pack .salir -side right

# Creamos el boton de abrir Abiword y lo colocamos abajo en la parte izquierda.

button .procesador -text "Abiword" -command "exec abiword"
pack .procesador -side left

Lo salvamos y cuando lo ejecutando haciendole un click desde la ventana de Rox nos aparecera:


Image


A apretar el boton sobre Abiword se nos ejecutara el programa Abiword y al apretar Salir nos saldremos del formulario, " Se me calleron las lagrimas cuando hize este formulario y me funciono" para una persona tan torpe como yo era lo mas.

Ni decir tiene que la orden exec Abiword podeis sustuirla por la que querais podeis poner exec y el programa que querais o otras ordenes.

Bueno vamos con otro, el siguiente es una escala y lo llamaremos scroll.tcl

scale .escala -from 0 -to 100 -length 200 -variable x -orient horizontal -label "El valor de la escala es..." -command escala
proc escala { valor } {
puts "El valor de la variable asociada a la escala es $valor"
}
pack .escala
button .salir -text "Salir" -command exit
pack .salir -side right
Ojo por que las lineas tienen no se deben cortar y empezar otra linea, no lo admiteria el comando wish y daria error.

Yo de echo he intentado correr algunos programas que hay por ahi que para separar lineas que son continuas utilizan la barra " \ " y no se por que algunas veces dan problemas, por lo cual intento evitarlas.

Al ejecutarlo el icono desde Rox con el click de Raton nos aparecera:

Image


Segun desplacemos la barra de la escala nos ira aumentando el valor de la escala.

El siguiente ejercicio es scroll.tcl y el programa sera el siguiente:

proc ScrollTexto { parent args } {
# Crea la frame donde colocar el widget texto.
frame $parent -borderwidth 10
pack $parent -side top -expand yes -fill y
# Crea dos barras de scroll, una vertical y otra horizontal.
scrollbar $parent.sy -command "$parent.texto yview"
scrollbar $parent.sx -orient horizontal -command "$parent.texto xview"
# Cre un widget texto con las dos barras de scroll asociadas.
eval {text $parent.texto -relief sunken -bd 2 -wrap none -wrap none \
-yscrollcommand [list $parent.sy set] \
-xscrollcommand [list $parent.sx set] } \
$args
# Coloca todo en la pantalla.
grid $parent.texto -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news
grid $parent.sy -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky ns
grid $parent.sx -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky ew
grid rowconfig $parent 0 -weight 1 -minsize 0
grid columnconfig $parent 0 -weight 1 -minsize 0
# Devuelve el nombre del widget texto.
return $parent.texto
}
wm title . "Barras de scroll"
# Se llama al procedimiento para que lo cree todo.
ScrollTexto .p -width 20 -height 10

button .salir -text "Salir" -command exit
pack .salir -side right


y lo que veremos sera los siguiente:

Image


Dentro de esta ventana si empezamos a escibir veremos que si nos pasamos del tamaño de la ventana a la derecha se nos ira ampliando el scroll a la derecha y si nos pasamos de lo de tamaño por abajo, se nos ira ampliando el scroll hacia abajo.

El siguiente ejercicio es menus.tcl y debereis copiar el siguiente programa dentro del fichero:

set w .menu
catch {destroy $w}
toplevel $w
wm title $w "Menu al estilo nuevo"
destroy .menus
wm geometry $w 300x50
# Se declara el menu.
menu $w.menu -tearoff 0
# Se crea el primer item de la barra de menús.
set m $w.menu.fichero
menu $m -tearoff 0
$w.menu add cascade -label "Fichero" -menu $m -underline 0
$m add command -label "Nuevo ..." -command {} -underline 0
$m add command -label "Abrir" -command {} -underline 0
$m add command -label "Guardar" -command {} -underline 1
$m add command -label "Guardar como" -command {} -underline 0
$m add separator
$m add command -label "Preparar página ..." -command {}
$m add command -label "Imprimir ..." -command {}
$m add separator
$m add command -label "Salir" -command "destroy $w"
set m $w.menu.edicion
menu $m -tearoff 0
$w.menu add cascade -label "Edición" -menu $m -underline 0
$m add command -label "Cortar" -command {} -accelerator CTRL+Z -underline 3
$m add command -label "Copiar" -command {} -accelerator CTRL+V -underline 0
$m add command -label "Pegar" -command {} -accelerator CTRL+X -underline 0
$m add command -label "Eliminar" -command {} -accelerator SUPR -underline 0
$m add separator
$m add command -label "Seleccionar todo" -command {} -accelerator F5 -underline 0
$m add command -label "Hora/Fecha" -command {} -underline 0
$m add separator
$m add command -label "Ajuste de línea" -command "destroy $w"
# Es necesario asignar binds a los menus que tienen acelerador...
bind $w <Control-z> {puts "Se ha pulsado CTRL+Z"}
bind $w <Control-v> {puts "Se ha pulsado CTRL+V"}
bind $w <Control-x> {puts "Se ha pulsado CTRL+X"}
set m $w.menu.cascade
$w.menu add cascade -label "Cascadas" -menu $m -underline 0
menu $m -tearoff 0
$m add cascade -label "Botones de checkeo" -menu $w.menu.cascade.check -underline 0
$m add cascade -label "Botones de radio" -menu $w.menu.cascade.radio -underline 0
set m $w.menu.cascade.check
menu $m -tearoff 0
$m add check -label "Chequeo del aceite" -variable oil
$m add check -label "Checkeo de la transmisión" -variable trans
$m add check -label "Chequeo de los frenos" -variable brakes
$m add check -label "Chequeo de luces" -variable lights
# Inicializa la 1 y la 3
$m invoke 1
$m invoke 3
set m $w.menu.cascade.radio
menu $m -tearoff 0
$m add radio -label "10" -variable pointSize -value 10
$m add radio -label "14" -variable pointSize -value 14
$m add radio -label "18" -variable pointSize -value 18
$m add radio -label "24" -variable pointSize -value 24
$m add radio -label "32" -variable pointSize -value 32
$m add sep
$m add radio -label "Roman" -variable style -value roman
$m add radio -label "Bold" -variable style -value bold
$m add radio -label "Italic" -variable style -value italic
# Inicializa la 1 y la 7
$m invoke 1
$m invoke 7
$w configure -menu $w.menu
button .salir -text "Salir" -command exit
pack .salir -side right

Bueno pues lo que sale en esto menus.tcl es:


Image


Este formulario que trae un monton de menus desplegables, que todavia no me estudiado bien el programa, pero estoy en ello, por el momento esto es lo que tengo, hay mas widgets que tengo que poner aqui pero darme mas tiempo.

Hasta ahora son formularios muy sencillos, pero lo que busco es los conceptos basicos de cada comando, boton, menu etc...

Dentro del directorio de Puppy en /usr/bin encontramos en un monton de carpetas una de ellas por ejemplo: es la carpeta /imag1.2 y se encuentra el fichero demo.tcl y se nos abrira un formulario con un monton de cosas que se puede hacer con este sistema de programacion. Si abriis este fichero en forma de texto veis todo el programa....... yo no entiendo casi nada de el. Veo que hay llamadas a otros ficheros tales combobox.tcl.
En otros directoriores de /usr/bin tal como /bwidget se encuentran un monto de estos ficheros con extension *.tcl que no se ejecutan en si pero que sirven de librerias para otros programas de formularios........ todo esto me parece interesantisimo. El directorio /usr/bin conviene que mireis por el....

Yo programo en visual Basic para hacer programas que interaccionan con microcontroladores, pero siempre me ha tentado hacer lo mismo con Linux, pero todavia mis conocimientos tanto en Linux como en programacion de TCL/TK son muy pero que muy escasos. Asi que ire poniendo mas ejemplos aqui.

Si alguien quiere colaborar con esta seccion, aqui esta abierto para cualquier ampliacion de tema, agradeceria que empezaran por programas como estos muy sencillitos.

Estoy enamorado de el sistema operativo Linux Puppy y eso que mis conocimientos son muy pero que muy basicos, pero poder hacer correr un sistema operativo desde un Pendrive me parece maravilloso.

caka
Posts: 202
Joined: Thu 07 Dec 2006, 17:19

#2 Post by caka »

Muy interesante tu post. Gracias por compartir tus conocimientos. Ahora no tengo mucho tiempo libre, pero ya le echaré un vistazo de forma detenida.

Siempre me pregunté como haría rarsa para crear el "Network Wizard" con sus botones, ventanas... y seguramente lo ha hecho mas o menos siguiendo los pasos que tu indicas. Pero ya te digo que yo no tengo ni idea sobre el tema. Rarsa hace mucho que no se pasa por este subforo y la verdad es que yo lo echo de menos. Quizás si le mandas un mensaje privado te contesta y si existe un procedimiento mejor que el tuyo para crear este tipo de programas seguro que te lo dice. Pero parece que vas por buen camino y repito que gracias por compartir tus conocimientos. A mí me sirve para aprender algo que desconocia y esto yo lo agradezco.

Por último yo tambien estoy enamorado de Puppy pero más que por lo de poder meterlo en un pendrive, por su pequeño tamaño comparado con otras distros, por su sencillez, por su rapidez de carga y gran número de aplicaciones y utilidades. Ten en cuenta que ahora hay pendrives de 4 Gb o más no muy caros, y yo ya ví por ahí algunos manuales para meter distribuciones Linux en esos cacharros (pero claro son distros de 700 Mb o de más de 1 Gb).

User avatar
fabio_n_cabrera
Posts: 81
Joined: Mon 16 Jul 2007, 12:26
Location: Argentina

Pasión por puppy

#3 Post by fabio_n_cabrera »

Gracias por el post mister_electrónico:

Muy interesante!

Comparto la pasión por Puppy, y sumo a los motivos dados, la posibilidad de hacerlo correr en PC con hardware humilde, y su transparencia (la facilidad para adaptarlo a nuestras necesidades)

En mi caso, solo tenía la limitación del idioma para compartirlo con mis conocidos, cosa que ahora está superada.

Saludos,

Fabio.-

User avatar
mister_electronico
Posts: 969
Joined: Sun 20 Jan 2008, 20:20
Location: Asturias_ España
Contact:

Espero que os animeis todos no solo que observeis... vereis

#4 Post by mister_electronico »

Hola gracias por vuestras contestaciones Caka y Fabio_n_Cabrea... os respondo segun orden de contestacion.

Caka

Hay muchas formas de crear formularios, ventanas .... widgets en general, con Wish, con Qt, con Phyton, y un largo etc.. se pueden crear programas. o con G++ se puede crear con el que quieras.

La forma que yo lo hago es con wish por la que me lo encontre casualmente trasteando con el puppy y sobre todo la inmediatez..... puedes hacer formularios muy rapidamente, ademas se le pueden añadir programacion en C.....

Decir que soy un novato ..... y lo que he puesto en el post es lo que he aprendido en una semana practicando y copiando de por ahi.....

Fabio_n_Cabrea..

Esta tarde me voy a comprar un pendrive de 4 Gb y voy a meter Puppy 3.01 que el otro dia lo prove en el live CD y note mejoras con respecto a la 2.15 que tengo.

A lo mejor escribo a rarsa pero no quiero forzar a nadie.... solo deso que prueben los programas que he escrito y se animen.... funcionan perfectamente en Puppy por que yo los he probado.... y que se animen a programar y ha ponerlos aqui en el Post..... ANIMAROS y vereis que entretenido es hacer vuestros propios formularios y programas....

YO PROMETO SEGUIR PONIENDO EJEMPLOS Y ESTUDIANDO EL TEMA.... UN SALUDO A TODOS. SUERTE DESDE OVIEDO (ESPAÑA) ....... ANGEL.

wow
Posts: 1052
Joined: Fri 30 Jun 2006, 00:18
Location: Peru

#5 Post by wow »

Hola Angel, hace algo de tiempo rarsa creo un dotpup para instalar Gnocl(implementación de GTK para el lenguaje TCL) creo que te parecerá interesante asi que dejo el enlace:

Gnocl: A native GTK Tcl toolkit
http://www.murga-linux.com/puppy/viewtopic.php?t=15639
[url=http://www.puppylinux.com][img]http://i.imgur.com/M4OyHe1.gif[/img][/url]

User avatar
mister_electronico
Posts: 969
Joined: Sun 20 Jan 2008, 20:20
Location: Asturias_ España
Contact:

Gracias Wow

#6 Post by mister_electronico »

Gracias le echare un vistazo.... ando un poquito liado..... por eso espero que se apunte mas gente a esto para compartir mas ideas......

Gracias a todos nos vemos.

Post Reply