require(tcltk) # Load the tcltk package oneinput <- function(mode, ioff, factor) { wvar <- tclVar("") xvar <- tclVar("") yvar <- tclVar("") zvar <- tclVar("") tt <- tktoplevel() tkwm.title(tt,mode) w.entry <- tkentry(tt, textvariable=wvar) x.entry <- tkentry(tt, textvariable=xvar) y.entry <- tkentry(tt, textvariable=yvar) z.entry <- tkentry(tt, textvariable=zvar) reset <- function() { tclvalue(xvar)<-"" } reset.but <- tkbutton(tt, text="Reset", command=reset) submit <- function() { w <- as.numeric(tclvalue(wvar)) * factor + ioff x <- as.numeric(tclvalue(xvar)) * factor + ioff y <- as.numeric(tclvalue(yvar)) * factor + ioff z <- as.numeric(tclvalue(zvar)) * factor + ioff e <- parent.env(environment()) e$w <- w e$x <- x e$y <- y e$z <- z tkdestroy(tt) } submit.but <- tkbutton(tt, text="submit", command=submit) tkgrid(tklabel(tt,text="Enter Four Inputs"),columnspan=2) tkgrid(tklabel(tt,text="Input1"), w.entry, pady = 10, padx =10) tkgrid(tklabel(tt,text="Input2"), x.entry, pady = 10, padx =10) tkgrid(tklabel(tt,text="Input3"), y.entry, pady = 10, padx =10) tkgrid(tklabel(tt,text="Input4"), z.entry, pady = 10, padx =10) tkgrid(submit.but, reset.but) tkwait.window(tt) return(c(w,x,y,z)) } twoinput <- function(mode){ wvar <- tclVar("") xvar <- tclVar("") yvar <- tclVar("") zvar <- tclVar("") tt <- tktoplevel() tkwm.title(tt,mode) w.entry <- tkentry(tt, textvariable=wvar) x.entry <- tkentry(tt, textvariable=xvar) y.entry <- tkentry(tt, textvariable=yvar) z.entry <- tkentry(tt, textvariable=zvar) reset <- function() { tclvalue(xvar)<-"" } reset.but <- tkbutton(tt, text="Reset", command=reset) submit <- function() { w <- tclvalue(wvar) x <- tclvalue(xvar) y <- tclvalue(yvar) z <- tclvalue(zvar) e <- parent.env(environment()) e$w <- w e$x <- x e$y <- y e$z <- z tkdestroy(tt) } submit.but <- tkbutton(tt, text="submit", command=submit) tkgrid(tklabel(tt,text="Enter Four Inputs"),columnspan=2) tkgrid(tklabel(tt,text="Input1"), w.entry, pady = 10, padx =10) tkgrid(tklabel(tt,text="Input2"), x.entry, pady = 10, padx =10) tkgrid(tklabel(tt,text="Input3"), y.entry, pady = 10, padx =10) tkgrid(tklabel(tt,text="Input4"), z.entry, pady = 10, padx =10) tkgrid(submit.but, reset.but) tkwait.window(tt) return(c(w,x,y,z)) } plotit <- function(X,Y,Labels) { # if (length(X)!=length(Y) || length(from)!=length(to)) # stop("invalid data") top <- tktoplevel() tktitle(top) <- "Plotting Geographicals" canvas <- tkcanvas(top, relief="raised", height=200, width=400) tkpack(canvas) moveNode <- function(i) { force(i) function(x,y){ x <- as.numeric(x) y <- as.numeric(y) for ( e in nodeEdges[[i]] ){ tkcoords(canvas,e$edgeItem,x,y,X[e$to],Y[e$to]) } tkmove(canvas, nodeItem[i], x-X[i],y-Y[i]) X[i] <<- x Y[i] <<- y } } nodeEdges <- vector("list",length(x)) nodeItem <- vector("character",length(x)) for ( i in seq(along=from) ) { f <- from[i] t <- to[i] # add line to canvas e <- tkcreate(canvas, "line", X[f],Y[f],X[t],Y[t], width=2) nodeEdges[[f]] <- c(nodeEdges[[f]],list(list(to=t, edgeItem=e))) nodeEdges[[t]] <- c(nodeEdges[[t]],list(list(to=f, edgeItem=e))) } for ( i in seq(along=x) ) { # add the nodes p <- tkcreate(canvas,"oval",X[i]-6,Y[i]-6,X[i]+6,Y[i]+6, fill="red") l <- tkcreate(canvas,"text", X[i]+6, Y[i], text=Labels[i], anchor="nw", font="10x20") tag <- paste("node",i,sep="") tkaddtag(canvas, tag, "withtag", p) tkaddtag(canvas, tag, "withtag", l) nodeItem[i] <- tag # animate them ... for another tutorial # tkitembind(canvas, p, "", moveNode(i)) } e <- tkcreate(canvas, "line", 0,90,360,90, width=2) l <- tkcreate(canvas,"text", 0, 92, text="Equator", anchor="nw", font="10x20") e <- tkcreate(canvas, "line", 180,180,180,0, width=2) l <- tkcreate(canvas,"text", 182, 170, text="GMT", anchor="nw", font="10x20") } # test code library(tcltk) lbl <- twoinput("Placenames - 4 for Latitude,Longitude") y <- oneinput("Latitudes - 4 Decimal ", 90, -1.0) x <- oneinput("Longitudes - 4 Decimal ", 180, 1.0) plotit(x,y,lbl)