tcltk : fonction associé au tkbutton

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Jean-Pierre Desvignes
Messages : 4
Enregistré le : 11 Juin 2009, 12:50

tcltk : fonction associé au tkbutton

Messagepar Jean-Pierre Desvignes » 13 Oct 2010, 09:10

Bonjour,

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

Jean-Pierre Desvignes
Messages : 4
Enregistré le : 11 Juin 2009, 12:50

Messagepar Jean-Pierre Desvignes » 13 Oct 2010, 15:24

Pour infos, j'ai fait d'autres tests.

_ la fonction test() éxécuté seul fonctionne bien
_si je créée au préalable la progress barre dans la même fenêtre que le bouton OK, même résultat la barre passe de 0 à 100% une fois fini.
_si je met un print(i) dans la fonction je voie bien que ça tourne mais ça me donne pas ma barre de progression.
_J'ai mis en command l'éxécution d'un script (via source() ) qui doit afficher la barre mais toujours rien.

Donc dès que j'associe une fonction au bouton OK je ne peux pas voir le déroulement mais seulement le résultat une fois fini.

Comment faire en sorte que lorsque je clique sur OK je puisse avoir ma nouvelle fenêtre avec le défilement de la barre en temps réel.


Encore merci !

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Messagepar Dominique Soudant » 13 Oct 2010, 15:43

xrandr est système spécifique, je pense.

Jean-Pierre Desvignes
Messages : 4
Enregistré le : 11 Juin 2009, 12:50

Messagepar Jean-Pierre Desvignes » 13 Oct 2010, 15:45

Dominique Soudant a écrit :xrandr est système spécifique, je pense.


xrandr c'est juste pour récupérer la résolution d'écran. On peut le lever la fenetre apparaitra dans le coin c'est tout.
Je vais mettre à jour le code pour le simplifier

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Messagepar Dominique Soudant » 13 Oct 2010, 15:51

Wep.

Cela dit ... J'ai pour habitude de séparer GUI et fonctionnel. De cette manière si mon GUI prend l'eau pour une quelconque raison, mon fonctionnel tient toujours la route. Et par ailleurs, si je suis amené à porter mon programme sur un autre système où mes outils de GUI initiaux ne sont pas disponibles ou subtilement différents, je n'ai que le GUI à modifier.

Par voie de conséquence, et dans ce qui devient chez moi une habitude de réponse à coté de la question, pourquoi ne pas effectuer cette séparation et ainsi avoir d'une part un GUI qui va jusqu'au OK et un fonctionnel qui prend le relai et gére sa progressBar ?

EDIT:
je dis ça, mais je confesse que je n'ai pas forcément lu le code avec attention ...

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Messagepar Dominique Soudant » 13 Oct 2010, 16:14

Ceci

Code : Tout sélectionner

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(){
  pb <- tkProgressBar("test progress bar", "Some information in %",
                      0, 100, 50)
  Sys.sleep(0.5)
  u <- c(0, sort(runif(20, 0 ,100)), 100)
  for(i in u) {
      Sys.sleep(0.1)
      info <- sprintf("%d%% done", round(i))
      setTkProgressBar(pb, i, sprintf("test (%s)", info), info)
  }
  Sys.sleep(5)
  close(pb)
}
ne fait pas ce que tu veux ?

Didier Plat
Messages : 225
Enregistré le : 02 Nov 2009, 16:47
Contact :

Messagepar Didier Plat » 13 Oct 2010, 16:29

Bonjour,
Mettre à jour à la fin de l'exécution de progressBar() grâce à la commande tcl("update") devrait te permettre d'obtenir l'affichage de l'évolution des divers indicateurs (barre et calculs).

Jean-Pierre Desvignes
Messages : 4
Enregistré le : 11 Juin 2009, 12:50

Messagepar Jean-Pierre Desvignes » 14 Oct 2010, 07:33

Didier Plat a écrit :Bonjour,
Mettre à jour à la fin de l'exécution de progressBar() grâce à la commande tcl("update") devrait te permettre d'obtenir l'affichage de l'évolution des divers indicateurs (barre et calculs).



Merci ! ça marche nikel !

J'ai pas réussi à trouver cette fonction dans R, pourtant c'était tout bête !

Merci aussi à Dominique pour ses conseils


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron