j'ai un petit soucis. Je souhaite faire une petite application graphique en R avec le package tcltk. Sur l'interface principale je récupère des paramètres et j'ai un bouton ok.
A ce bouton OK j'associe une fonction qui va vérifier les paramètres entrées et lancer un fonction. La nouvelle fonction doit faire apparaitre une nouvelle fenêtre avec une barre de progression et des commentaires qui évoluent.
Le problème c'est que quand je clique sur OK c'est une fois seulement la fonction finie que j'ai ma nouvelle fenetre qui apparait. Je voudrais qu'elle apparaisse dès le début pour voir l'évolution.
je vous joint un exemple qui permet de voir le problème. c'est juste un bouton qui doit afficher ma barre de progression, mais même problème elle apparait une fois complète.
Code : Tout sélectionner
createProgressBar <- function(){
# creates a window and adds a tcltk progress bar
assign("niter", tclVar(0), pos=1)
assign("timeLeft", tclVar(0), pos=1)
assign("etape", tclVar(""), pos=1)
tw <- tktoplevel()
w <- 350
h <- 150
x <- (1000/2) - (w/2)
y <- (900/2) - (h/2)
tkwm.geometry(tw,paste(w,"x",h,"+",x,"+",y,sep=""))
tkgrid.propagate(tw, 0)
tkwm.title(tw, "Progress Bar")
progressbar <- ttkprogressbar(tw, variable=niter)
description <- tklabel(tw, textvariable=etape)
tkgrid(tklabel(tw,text=" "),row=1,column=3)
tkgrid(progressbar,row=2,column=2)
tkgrid(tklabel(tw,text=" "),row=3,column=3)
tkgrid(description,row=4,columnspan=3)
tkgrid(tklabel(tw,text=" "),row=5,column=3)
tkgrid(tklabel(tw, text="Temps écoulé:"),tklabel(tw, textvariable=timeLeft), columnspan=2,padx=1, pady=5)
}
progressBar <- function(i, M){
# function to be inserted into the loop
# i - current index of the loop
# M - the number of iterations
if(i == 1){
createProgressBar()
assign("beginTime", Sys.time(), pos=1)
}
cp <- floor(i/M*100)
tclvalue(niter) <- cp
tclvalue(timeLeft) <- round(as.numeric(difftime(Sys.time(),beginTime,tz="",units="auto")),2)
tclvalue(etape) = paste("etape :", i , "/" , M ,sep="")
}
## Check box
tt <- tktoplevel()
cb <- tkcheckbutton(tt)
cbValue <- tclVar("0")
tkconfigure(cb,variable=cbValue)
tkgrid(tklabel(tt,text="lance le test"),cb)
OnOK <- function()
{
cbVal <- as.character(tclvalue(cbValue))
tkdestroy(tt)
if (cbVal=="1")
test()
if (cbVal=="0")
tkmessageBox(message="no test!",icon="warning")
}
OK.but <- tkbutton(tt,text="OK",command=OnOK)
tkgrid(OK.but)
tkfocus(tt)
test <- function(){
# example
M <- 1000
for(i in 1:M){
progressBar(i, M)
x <- rnorm(1000)
}
}
Je vous remercie par avance de prendre le temps de me répondre