# INTERFACES GRAFICAS DE KAREL ############################################################################### ############################################################################### # INTERFACES GRAFICAS DE KAREL # # Autor: Ing. CUAUHTEMOC RIVERA LOAIZA # # Universidad Michoacana de San Nicolas de Hidalgo # # Seccion de Graduados de la Facultad de Ingenieria # Electrica # # Maestria en Sistemas Computacionales # # Noviembre 1997 crivera@scfie.eie.umich.mx ############################################################################### ############################################################################### catch {destroy .karel} catch {destroy .programa} ######### CIUDAD DE KAREL toplevel .karel wm title .karel "El Mundo de Karel" canvas .karel.ambiente -width 556 -height 535 -bg white .karel.ambiente create text 280 10 -text "A V E N I D A S" -fill blue .karel.ambiente create text 10 225 -text "C" -fill blue .karel.ambiente create text 10 245 -text "A" -fill blue .karel.ambiente create text 10 265 -text "L" -fill blue .karel.ambiente create text 10 285 -text "L" -fill blue .karel.ambiente create text 10 305 -text "E" -fill blue .karel.ambiente create text 10 325 -text "S" -fill blue ######## EJE X set linea 0 for { set i 20} { $i <= 520 } { set i [expr $i +20] } { if { fmod($linea,2) == 0} {set color gray80} {set color gray60} .karel.ambiente create line 40 $i 520 $i -fill $color incr linea } ######### EJE Y set linea 0 for { set i 40} { $i <= 520 } { set i [expr $i +20] } { if { fmod($linea,2) == 0} {set color gray80} {set color gray60} .karel.ambiente create line $i 20 $i 520 -fill $color incr linea } # Numeracion de las calles set j 21 for { set i 25} { $i >0 } { incr i -1 } { set j [expr $j + 20] if { fmod( $j , 2) != 0} { .karel.ambiente create text 30 $j -text "$i"} } # Numeracion de las avenidas set j 21 for { set i 1 } { $i < 26 } { incr i } { set j [expr $j +20] if { fmod( $j , 2) != 0} { .karel.ambiente create text $j 530 -text "$i" } } #PUNTOS CARDINALES .karel.ambiente create line 540 220 540 340 -width 3 -arrow both .karel.ambiente create line 530 280 550 280 -width 3 -arrow both .karel.ambiente create text 540 215 -text "N" .karel.ambiente create text 540 345 -text "S" #.karel.ambiente create text 265 490 -text "E" #.karel.ambiente create text 195 490 -text "O" pack .karel.ambiente -side top ############################################################################ #### INTERFAZ PARA EL PROGRAMA FUENTE, HECHA CON EL "Visual Tcl v1.10 Project" #### http://www.neuron.com ############################################################################ ############################################################################# proc Window {args} { global vTcl set cmd [lindex $args 0] set name [lindex $args 1] set newname [lindex $args 2] set rest [lrange $args 3 end] if {$name == "" || $cmd == ""} {return} if {$newname == ""} { set newname $name } set exists [winfo exists $newname] switch $cmd { show { if {$exists == "1" && $name != "."} {wm deiconify $name; return} if {[info procs vTclWindow(pre)$name] != ""} { eval "vTclWindow(pre)$name $newname $rest" } if {[info procs vTclWindow$name] != ""} { eval "vTclWindow$name $newname $rest" } if {[info procs vTclWindow(post)$name] != ""} { eval "vTclWindow(post)$name $newname $rest" } } hide { if $exists {wm withdraw $newname; return} } iconify { if $exists {wm iconify $newname; return} } destroy { if $exists {destroy $newname; return} } } } ############################################### # PROCEDIMIENTOS GENERADOS POR EL VISUAL TCL # proc vTclWindow. {base} { if {$base == ""} { set base . } ############################ #CREACION DE LOS WIDGETS ############################ wm focusmodel $base passive wm geometry $base 200x200+0+0 wm maxsize $base 1028 749 wm minsize $base 132 1 wm overrideredirect $base 0 wm resizable $base 1 1 wm withdraw $base wm title $base "vt" ##################################### # POSICIONAMIENTO DE LOS WIDGETS ##################################### } proc vTclWindow.programa {base} { if {$base == ""} { set base .programa } if {[winfo exists $base]} { wm deiconify $base; return } ############################ #CREACION DE LOS WIDGETS ############################ toplevel $base -class Toplevel \ -background #0080ff wm focusmodel $base passive wm geometry $base 360x508+403+21 wm maxsize $base 1028 749 wm minsize $base 132 1 wm overrideredirect $base 0 wm resizable $base 1 1 wm deiconify $base wm title $base "Karel para Linux" frame $base.cpd19 \ -borderwidth 1 -height 30 -relief raised -width 30 scrollbar $base.cpd19.01 \ -borderwidth 1 -command {.programa.cpd19.03 xview} -orient horiz \ -width 10 scrollbar $base.cpd19.02 \ -borderwidth 1 -command {.programa.cpd19.03 yview} -orient vert \ -width 17 text $base.cpd19.03 \ -background #ffffff \ -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* -height 1 \ -width 8 -xscrollcommand {.programa.cpd19.01 set} \ -yscrollcommand {.programa.cpd19.02 set} frame $base.cpd21 \ -background #c0c0c0 -borderwidth 1 -height 30 -relief sunken \ -width 30 menubutton $base.cpd21.01 \ -activebackground #c0c0c0 -anchor w -menu .programa.cpd21.01.02 -padx 4 \ -pady 3 -text Archivo -width 6 menu $base.cpd21.01.02 \ -cursor {} -tearoff 0 $base.cpd21.01.02 add command \ -label Nuevo \ -command { set alto 1 destroy .karel.ambiente set boton Avance source klnx_ambiente.tcl .programa.cpd19.03 delete 1.0 end } $base.cpd21.01.02 add command \ -label Abrir -command { carga_archivo .programa.cpd19.03 archivo_x 1 set avance 0} $base.cpd21.01.02 add separator $base.cpd21.01.02 add command \ -command {destroy .karel destroy .programa} -label Salir menubutton $base.cpd21.03 \ -activebackground #c0c0c0 -anchor w -menu .programa.cpd21.03.04 -padx 4 \ -pady 3 -text Edicion menu $base.cpd21.03.04 \ -cursor {} -tearoff 0 $base.cpd21.03.04 add command \ -label Cortar -command CORTAR_AL_PORTAPAPELES $base.cpd21.03.04 add command \ -label Copiar -command COPIAR_AL_PORTAPAPELES $base.cpd21.03.04 add command \ -label Pegar -command { PEGAR_DEL_PORTAPAPELES .programa.cpd19.03 } menubutton $base.cpd21.05 \ -activebackground #c0c0c0 -anchor w -menu .programa.cpd21.05.06 -padx 4 \ -pady 3 -text Ayuda menu $base.cpd21.05.06 \ -tearoff 0 $base.cpd21.05.06 add command \ -label "Acerca de ..." -command {source klnx_acerca.tcl } menubutton $base.cpd21.men23 \ -activebackground #c0c0c0 -anchor w -menu .programa.cpd21.men23.01 \ -padx 4 -pady 3 -text Opciones -width 6 menu $base.cpd21.men23.01 \ -tearoff 0 $base.cpd21.men23.01 add command \ -label "Ver Archivo *.kar" -command muestra_fuente menubutton $base.cpd21.men24 \ -activebackground #c0c0c0 -anchor w -menu .programa.cpd21.men24.01 \ -padx 4 -pady 3 -text Compila -width 6 menu $base.cpd21.men24.01 \ -tearoff 0 $base.cpd21.men24.01 add command \ -label Compilar menubutton $base.cpd21.men25 \ -activebackground #c0c0c0 -anchor w -menu .programa.cpd21.men25.01 \ -padx 4 -pady 3 -text Ejecuta -width 6 menu $base.cpd21.men25.01 \ -tearoff 0 $base.cpd21.men25.01 add command \ $base.cpd21.men25.01 add command \ 0 ] } $base.cpd21.men25.01 add command \ ] } button $base.but17 \ -background green -padx 11 -pady 4 -textvariable boton \ -command { avanza_instruccion $memoria($avance) $avance .programa.but17 configure -bg green -fg black set boton Avance set alto 1 incr avance } entry $base.etiqueta -textvariable archivo\ -width 30 -bg white bind $base.etiqueta <Key-Return> { carga_archivo .programa.cpd19.03 $archivo 0 set avance 0} entry $base.nada \ -background #0080ff -relief raised -textvariable continua -width 0 pack $base.nada \ -in .programa -anchor ne -expand 0 -fill none -side top ##################################### # POSICIONAMIENTO DE LOS WIDGETS ##################################### place $base.cpd19 \ -x 10 -y 80 -width 343 -height 416 -anchor nw grid columnconf $base.cpd19 0 -weight 1 grid rowconf $base.cpd19 0 -weight 1 grid $base.cpd19.01 \ -in .programa.cpd19 -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky ew grid $base.cpd19.02 \ -in .programa.cpd19 -column 1 -row 0 -columnspan 1 -rowspan 1 -sticky ns grid $base.cpd19.03 \ -in .programa.cpd19 -column 0 -row 0 -columnspan 1 -rowspan 1 \ -sticky nesw place $base.cpd21 \ -x 5 -y 10 -width 325 -height 25 -anchor nw pack $base.cpd21.01 \ -in .programa.cpd21 -anchor center -expand 0 -fill none -side left pack $base.cpd21.03 \ -in .programa.cpd21 -anchor center -expand 0 -fill none -side left pack $base.cpd21.05 \ -in .programa.cpd21 -anchor center -expand 0 -fill none -side right place $base.cpd21.men23 \ -x 105 -y 0 -width 63 -height 23 -anchor nw place $base.cpd21.men24 \ -x 170 -y 5 -width 59 -height 15 -anchor nw place $base.cpd21.men25 \ -x 225 -y 5 -width 54 -height 15 -anchor nw place $base.but17 \ -x 10 -y 45 -anchor nw -bordermode ignore place $base.etiqueta -x 100 -y 45 } ############################################################################ #### INTERFAZ PARA LA PILA DE KAREL ############################################################################ proc vTclWindow.programa.pila {base} { if {$base == ""} { set base .programa.pila } if {[winfo exists $base]} { wm deiconify $base; return } toplevel $base -class Toplevel \ -background #0080ff wm focusmodel $base passive wm geometry $base 246x232+554+198 wm maxsize $base 1028 749 wm minsize $base 132 1 wm overrideredirect $base 0 wm resizable $base 1 1 wm deiconify $base wm title $base "Pila" frame $base.frame \ -borderwidth 1 -height 30 -relief raised -width 30 scrollbar $base.frame.scrollx \ -borderwidth 1 -command {.programa.pila.frame.text xview} -orient horiz \ -width 10 scrollbar $base.frame.scrolly \ -borderwidth 1 -command {.programa.pila.frame.text yview} -orient vert \ -width 10 text $base.frame.text \ -background #ffffff \ -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* -height 1 \ -width 8 -xscrollcommand {.programa.pila.frame.scrollx set} \ -yscrollcommand {.programa.pila.frame.scrolly set} place $base.frame \ -x 5 -y 5 -width 238 -height 221 -anchor nw grid columnconf $base.frame 0 -weight 1 grid rowconf $base.frame 0 -weight 1 grid $base.frame.scrollx \ -in .programa.pila.frame -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky ew grid $base.frame.scrolly \ -in .programa.pila.frame -column 1 -row 0 -columnspan 1 -rowspan 1 -sticky ns grid $base.frame.text \ -in .programa.pila.frame -column 0 -row 0 -columnspan 1 -rowspan 1 \ -sticky nesw } Window show . Window show .programa Window show .programa.pila