6

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

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

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()
4

3 回答 3

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.
于 2010-05-13T09:31:06.490 回答
2

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

于 2010-04-21T12:43:06.640 回答
1

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

tcl("after", 300, my_long_operation)

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

svalue(sb) <- "Ready"
于 2011-10-19T04:46:45.097 回答