2010-08-14 6 views
3

J'ai essayé de définir plusieurs combos dans R en utilisant le paquetage tcltk mais en vain. J'utilise le code ci-dessous. Mon inspiration était here, mais je ne peux pas sembler juste étiqueter comboBox1, comboBox2, etc ... donc j'ai décidé d'essayer et de définir leurs valeurs de sortie dans un vecteur ... mais leurs valeurs de sortie ne font aucune sens pour moi ... des idées là-bas?comboboxes multiples dans R utilisant tcltk

merci beaucoup

require(tcltk) 
tclRequire("BWidget") 
tt <- tktoplevel() 
tkgrid(tklabel(tt,text="What's your favorite fruits?")) 
fruit <- c("Apple","Orange","Banana","Pear") 
num <- c(0:3) 
num.fruit <- cbind(num, fruit) 
#####1st box 
comboBox <- tkwidget(tt,"ComboBox",editable=FALSE,values=num.fruit[,2]) 
tkgrid(comboBox) 
Cbox1<- comboBox 
tkfocus(tt) 

######2nd box 

comboBox <- tkwidget(tt,"ComboBox",editable=FALSE,values=num.fruit[,2]) 
tkgrid(comboBox) 
Cbox2 <- comboBox 
### 

##preliminary wrap-ip to pass to OnOK function 
pref1 <- tcl(Cbox1,"getvalue") 
pref2 <- tcl(Cbox2,"getvalue") 

    Prefs <- c(pref1,pref2) 
######action on OK button 
OnOK <- function() 
{ 
    fruitChoice <- fruits[as.numeric(tclvalue(tcl(Prefs,"getvalue")))+1] 

    tkdestroy(tt) 
    msg <- paste("Good choice! ",fruitChoice,"s are delicious!",sep="") 
    tkmessageBox(title="Fruit Choice",message=msg) 

} 
OK.but <-tkbutton(tt,text=" OK ",command=OnOK) 
tkgrid(OK.but) 
tkfocus(tt) 

Répondre

3

Pourquoi ne pas utiliser juste ttkcombobox?

require(tcltk) 
tt <- tktoplevel() 
tkwm.title(tt, "Fruits!") 
tkwm.geometry(tt, "200x150+300+300") 

onOK <- function() 
    { 
    fav <- tclvalue(favFruit) 
    worst <- tclvalue(worstFruit) 

    if (fav != "Choose one") 
     tkmessageBox(title="Favorite fruit", message = paste("Your favorite fruit is", fav)) 
    if (worst != "Choose one") 
     tkmessageBox(title="Worst fruit", message = paste("The fruit you like the least is", worst)) 

    if (fav == "Choose one" & worst == "Choose one") 
     tkmessageBox(title="Well...", message = "Select a fruit!") 
    } 

label1 <- tklabel(tt, text="What's your favorite fruit?") 
label2 <- tklabel(tt, text="What fruit you like the least?") 

fruits <- c("Choose one", "Apple", "Orange", "Banana", "Pear") 
# Default selections for the two combo boxes 
favFruit <- tclVar("Choose one") 
worstFruit <- tclVar("Choose one") 

# 1st box 
combo.1 <- ttkcombobox(tt, values=fruits, textvariable=favFruit, state="readonly") 
# 2nd box 
combo.2 <- ttkcombobox(tt, values=fruits, textvariable=worstFruit, state="readonly") 
# If you need to do something when the user changes selection just use 
# tkbind(combo.1, "<<ComboboxSelected>>", functionname) 

OK.but <- tkbutton(tt,text=" OK ", command = onOK) 

tkpack(label1, combo.1) 
tkpack(label2, combo.2) 
tkpack(OK.but) 

tkfocus(tt) 

PS: personnellement, j'abandonné tcltk en faveur de RGtk2, beaucoup plus souple à mon avis, et vous pouvez concevoir des interfaces visuellement en utilisant l'interface Glade Designer

+0

Merci @nico c'était exactement ce dont j'avais besoin pour un projet similaire. Je souhaite que les paquets tcltk/2 aient une bonne documentation quelque part, mais s'il y en a, je ne l'ai pas trouvé. Pire encore, j'ai trouvé plusieurs exemples en ligne qui n'ont tout simplement pas fonctionné. J'aurais aimé l'avoir trouvé il y a quelques heures! – schradera

1

Si vous ne voulez pas être trop impliqué tcltk, vous pourriez trouver les gWidgets plus faciles à utiliser.

library(gWidgets) 
options(guiToolkit="tcltk") ## or RGtk2 or Qt 

w <- gwindow("Multiple comboboxes") 
tbl <- glayout(cont=w, horizontal=FALSE) 

fruit <- c("Apple","Orange","Banana","Pear") 


tbl[1,1] <- "Favorite fuits" 
tbl[1,2] <- (cb1 <- gcombobox(fruit, cont=tbl)) 

tbl[2,1] <- "Other fruit?" 
tbl[2,2] <- (cb2 <- gcombobox(fruit, cont=tbl)) 

tbl[3,2] <- (b <- gbutton("Ok", cont=tbl)) 

addHandlerClicked(b, handler=function(h,...) { 
    cat(sprintf("You picked %s and %s\n", svalue(cb1), svalue(cb2))) 
}) 
+0

c'est ce que je veux faire, c'est mettre la valeur combobox dans un vecteur et faire des choses avec ça. Mais je ne peux pas sembler ajouter addHandlerClicked à travailler en utilisant RGtk2 ou tcltk ou Qt –

+0

** Edit: Je l'ai eu à travailler en utilisant: install.packages ("gWidgetsRGtk2", dep = TRUE) trouvé sur ce site de documentation incroyable : http://user2007.org/program/presentations/verzani-1.pdf –

+0

L'implémentation de la boîte à outils Qt est sur r-forge: https://r-forge.r-project.org/R/?group_id=761. Il est encore en cours de développement, mais semble beaucoup mieux que la version tcltk. – jverzani

Questions connexes