Two tcltk questions and Re: [R] tcltk package functionality

Peter Wolf pwolf at
Fri Sep 29 10:14:08 CEST 2000

Sorry, for my mail from last night contains no subject.
Therefore, I send it again and two tcltk questions are appended.


Prasad wrote:

> I wrote a function in R which uses tcltk package .... essentially I wanted
> to give within that function, a widget with 2 radiobuttons to choose
> between plotting Precip and Temperature plots. After the user has chosen
> one of the radiobuttons there is another widget that asking him to identify
> outliers. However, I am having a lot of problems...what R does is evaluate
> the whole function without pausing...if I introduce a while() loop as I
> have in the example below, R does nothing until I hit cntrl-c upon which it
> shows the widget and comes out of the function......I could use a while
> loop in S-PLUS using the dialog.create() dialog.display() functions, but I
> cannot seem to implement that functionality in R.....what am I doing wrong?
> I enclose below the sample function...Any help will be greatly
> appreciated....

To stop the evaluation of a function until a specific tcltk action is done
you have to use the tk-function tkwait.variable().
The following function -- a simple modification of Prasad's
tcltktst function -- shows an example:

tcltk.test <- function(x1=1:10, x2=10:1) {
# define first toplevel-widget
 tt           <- tktoplevel()
 tktitle(tt)  <- "Diagnostics"
 label.widget <- tklabel(tt, text="Choose data for plot!")
 rbut.wid1    <- tkradiobutton(tt, text="x1", value="0", variable="choice")
 rbut.wid2    <- tkradiobutton(tt, text="x2", value="1", variable="choice")
 but.done     <- tkbutton(tt, text="FINISHED", command=function(){
                                                         tclvar$done <- "T"
                                                       } )
 tkpack(label.widget, rbut.wid1, rbut.wid2, but.done)
# wait until FINISHED is pressed
 tclvar$choice <- "0"
# plot x1 or x2
 if(tclvar$choice == "0") x <- x1
 if(tclvar$choice == "1") x <- x2
 if(is.null(names(x))) names(x) <- x
# define second toplevel widget
 tt2          <- tktoplevel()
 tktitle(tt2) <- "Action"
 but.wid21    <- tkbutton(tt2, text="print summary",
 but.wid22    <- tkbutton(tt2, text="identify outlier",
 but.wid23    <- tkbutton(tt2, text="exit", command=function(){
                                                    } )
 tkpack(but.wid21, but.wid22, but.wid23)
# wait until exit is pressed
 tclvar$done <- "F"


Here are another two tcltk question:

1. I want to add a scrollbar along the right side of a text widget. This can be
   achieved by .Tk.ID(). Is there a way to avoid to call .Tk.ID ---
   perhaps by using tkyview?

   tk.test1 <- function(nmax=3){
     tl         <- tktoplevel()
     tl.text    <- tktext(tl)
     tl.yscroll <- tkscrollbar(tl)
     tkconfigure(tl.text,   yscrollcommand=paste(.Tk.ID(tl.yscroll),"set"  ))
     tkconfigure(tl.yscroll,       command=paste(.Tk.ID(tl.text),   "yview"))
     tkpack(tl.text, tl.yscroll, side="left", fill="y")
     tkpack(tkbutton(tl, text="exit", command=function()tclvar$done<-"T"))
     tclvar$done <- "F"; tkwait.variable("done")

2. If I try to insert a text containing an unequal number of "{" and "}"
   brackets tkinsert stops with the error message:

     Error in .Tcl(.Tcl.args(...)) : [tcl] extra characters after close-brace.

   How can I change this behavior?

   tk.test2 <- function(nmax=3){
     tl         <- tktoplevel()
     tl.text    <- tktext(tl)
     for(i in 1:nmax){
       cat("input text? "); input.text<-readline()


Version information:
platform hppa2.0-hp-hpux10.20
major    1
minor    1.0
year     2000
month    June
day      15


Peter Wolf

R + tktcl is a very fantastic combination! Thanks to all of the Core team!
Hans Peter Wolf                       pwolf at
Fak. f. Wiwi.
Uni Bielefeld
33615 Bielefeld

r-help mailing list -- Read
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at

More information about the R-help mailing list