Robson, Samuel wrote:
> Dear all,
>
> I have run into a small problem with a GUI that I have been writing in R 
> using the tcltk package, and I was hoping that somebody on this forum may be 
> able to shed some light on it for me. The problem that I have is that when 
> the main function is called by a tkbutton() widget, the GUI window goes a bit 
> funny; all non-widget areas turn see-through. On top of this, a counter that 
> should be updating constantly will only update if the GUI window is moved. It 
> appears that the window is not loading fully, so even though the counter is 
> increasing correctly, it does not update on the window until you manually 
> force it by moving it. 
>
> However, if the function is called from the command line instead of linking 
> it to a button press, everything works fine. This leads me to believe that 
> the problem lies with the tkbutton(..., command=foo) command.
>
> As an example, consider the following code:
>
> tt <- tktoplevel()
> frameOverall <- tkframe(tt)
> counter <- tclVar("0")
>
> ## Top frame to contain counter
> topFrame <- tkframe(frameOverall)
>     progressLabel <- tklabel(topFrame, text=as.character(tclvalue(counter)))
>     tkgrid(tklabel(topFrame, text="   "))
>     tkgrid(progressLabel)
>     tkgrid(tklabel(topFrame, text="   "))
> tkgrid(topFrame)
>
> ## Function that makes the counter increase from 1 to 1000 when you press OK
> foo <- function() {
>     for (i in 1:1000) {
>         counter <- tclVar(as.character(as.numeric(tclvalue(counter))+1))
>         tkconfigure(progressLabel, textvariable=counter)
>     } 
> }
>
> ## Bottom frame to contain OK button
> botFrame <- tkframe(frameOverall)
>     tkgrid(tkbutton(botFrame, text="OK", command=foo))
> tkgrid(botFrame)
>
> tkgrid(frameOverall)
>
> Pressing the button should cause the counter to increase. However the problem 
> mentioned above occurs (move the window about to see the counter change. You 
> may also see the window turn see-through). Now run the script again, but 
> instead of pressing OK, run foo() manually in the command line. Everything 
> works fine.
>
> Is anybody able to tell me what is going wrong here? And more importantly, is 
> there a way around it?
>
>   
It's not happening for me (SuSE Linux 10.2). I don't see anything until
the loop is finished, though, which is as it should be since nothing
allows the event loop to process events (a tcl("update","idletasks") in
the loop fixes that) .

The coding is a bit odd in that you regenerate the counter variable on
each iteration, which is not the Intended Way. Rather, it is

foo <- function() {
    counter <- tclVar(0)
    tkconfigure(progressLabel, textvariable=counter)

   for (i in 1:1000) {
        tclvalue(counter) <- as.character(as.numeric(tclvalue(counter))+1)
     }  
}






> Many thanks for your assistance,
>
> Sam Robson
> MOAC Doctoral Training Center
> Coventry House
> University of Warwick
> Coventry
> CV4 7AL
>
>
>
>
>
>
>       [[alternative HTML version deleted]]
>
> _______________________________________________
> R-SIG-GUI mailing list
> R-SIG-GUI@stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-gui
>   


-- 
   O__  ---- Peter Dalgaard             Ă˜ster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - ([EMAIL PROTECTED])                  FAX: (+45) 35327907

_______________________________________________
R-SIG-GUI mailing list
R-SIG-GUI@stat.math.ethz.ch
https://stat.ethz.ch/mailman/listinfo/r-sig-gui

Reply via email to