你如何刷新R gWidget的内容?

时间:2010-04-21 12:00:43

标签: r gwidgets

我正在使用gWidgets(更具体地说是gWidgetstcltk)在R中创建GUI。我想知道如何更新选择类型小部件的内容,例如gdroplistgtable。我目前有一个相当hackish删除小部件并重新创建它的方法。我确信有更好的方法。

这个简单的例子显示了全局环境中的所有变量。

library(gWidgets)
library(gWidgetstcltk)

create.widgets <- function()
{
  grp <- ggroup(container = win)
  ddl <- gdroplist(ls(envir = globalenv()), 
    container = grp)
  refresh <- gimage("refresh", 
    dirname   = "stock",
    container = grp,
    handler   = function(h, ...)
    {
      if(exists("grp") && !is.null(grp)) 
      {
        delete(win, grp)
      }
      create.widgets()   
    }
  )
}

win <- gwindow()
create.widgets()

3 个答案:

答案 0 :(得分:4)

我采访了gWidgets *软件包的创建者John Verzani,答案非常简单(虽然不完全直观)。您可以使用widget_name[]访问列表类型小部件的内容。

library(gWidgets)
library(gWidgetstcltk)

get_list_content <- function() ls(envir = globalenv())  # or whatever

win <- gwindow()
grp <- ggroup(container = win)
ddl <- gdroplist(get_list_content(), container = grp)
refresh <- gimage("refresh", 
  dirname   = "stock",
  container = grp,
  handler   = function(h, ...) ddl[] <- get_list_content()   
)

请注意,存在一些限制:单选按钮列表必须保持相同的长度。

win <- gwindow()
rb <- gradio(1:10, cont = win)
rb[] <- 2:11     # OK
rb[] <- 1:5      # Throws an error; can't change length.

答案 1 :(得分:2)

AFAIK那些刷新事件通常由窗口管理器拥有,因此这可能很棘手。

答案 2 :(得分:1)

虽然问题标题是关于强制视觉刷新还是仅仅改变内容的讨论是模棱两可的,但我最近在长时间操作之前和之后都遇到了与gstatusbar更新类似的问题。虽然有一个名为REventLoop的REPL的替代品,但我发现使用tcl计时器非常方便。

tcl("after", 300, my_long_operation)

所以我在长时间操作之前更新gstatusbar,然后设置计时器,在不到一秒的时间内将激活我需要一段时间的函数,并在该函数结束时使用类似

的更新gstatusbar
svalue(sb) <- "Ready"