R 在gwidget中切换一组图标

R 在gwidget中切换一组图标,r,icons,handler,gwidgets,R,Icons,Handler,Gwidgets,我可以切换如下图标的显示: reject <- "D:/Pictures/web/close32.png" accept <- "D:/Pictures/web/open32.png" w= gwindow() g1 <- ggroup(horizontal=TRUE, cont=w) icon <- gimage(reject,cont=g1) state <- FALSE # a global changeState <- function(h,...)

我可以切换如下图标的显示:

reject <- "D:/Pictures/web/close32.png"
accept <- "D:/Pictures/web/open32.png"
w= gwindow()
g1 <- ggroup(horizontal=TRUE, cont=w)
icon <- gimage(reject,cont=g1)
state <- FALSE # a global
changeState <- function(h,...) {
   if(state) {
     svalue(icon) <- reject
     } else {
       svalue(icon) <- accept
       }
   state <<- !state
}
addHandlerClicked(icon, handler=changeState)

reject必须从处理程序中的
h$action
中检索
index
值(
index)我还意识到,在函数中更改的不是“svalue(icon[index]),而是“svalue(lyt[I,j]),其中action=list(ind,I,j)。但是,当我单击一个图标时,我得到了错误“Gtk CRITICAL**:Gtk_table_attach:assertion`child->parent==NULL”失败”我认为这只是一个警告,不是一个错误。您可能只需要对对象使用
h$obj
,当
h$obj
通过信号接收器时,您不需要通过全局索引进行查找。是的,对对象使用h$obj解决了问题。我非常感谢您的帮助。
reject <- "D:/Pictures/web/close32.png"
accept <- "D:/Pictures/web/open32.png"
w= gwindow()
g1 <- ggroup(horizontal=TRUE, cont=w)
lyt <- glayout(cont=g1, spacing=10)
icon <- rep(reject,times=9)
state <- rep(FALSE, times=9)

changeState <- function(h,...) {
  if(state[index]) {
    svalue(icon[index]) <- reject
  } else {
    svalue(icon[index]) <- accept
  }
  state[index] <<- !state[index]
}

for(i in 1:3){
  for(j in 1:3){
    ind <- (i-1) * 3 +j
    lyt[i,j] <- gimage(icon[ind], cont=lyt)
    addHandlerClicked(lyt[i,j], handler=changeState, action= index <-ind)
  }  
}