2010-04-21 10 views
6

Estoy creando una GUI en R usando gWidgets (más específicamente gWidgetstcltk). Me gustaría saber cómo actualizar el contenido de los widgets de tipo selección, como gdroplist y gtable. Actualmente tengo un método bastante hackish de eliminar el widget y volver a crearlo. Estoy seguro de que hay una mejor manera.¿Cómo se actualiza el contenido de un R gWidget?

Este sencillo ejemplo muestra todas las variables en el entorno global.

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

Respuesta

2

AFAIK esos eventos de actualización a menudo son propiedad del administrador de ventanas, por lo que esto puede ser complicado.

+0

En ese caso, ¿qué tan bajo debo llegar para tener acceso a este tipo de funcionalidad? ¿Harán el truco los paquetes 'tcltk' /' tcltk2'? ¿Es posible acceder directamente al administrador de ventanas desde R? –

+0

Bien, estoy admitiendo la derrota en esto. –

+1

No existe la derrota, pero para esto es posible que tengas que renunciar a _portability_ ya que depende tanto del administrador de ventanas. Un posible rayo de esperanza puede ser la unión a Qt en la que Deepayan y Michael han estado trabajando. Un día, estos pueden migrar de R-Forge a CRAN y darle una alternativa. –

4

Hablé con John Verzani, creador de los paquetes gWidgets *, y la respuesta es increíblemente simple (aunque no del todo intuitiva). Puede acceder al contenido de los widgets de tipo lista con 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() 
) 

Tenga en cuenta que hay algunas restricciones: las listas de botones de opción deben permanecer con la misma longitud.

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

Mientras que el título de la pregunta es ambigua si el habla de forzar actualización visual o simplemente cambiando el contenido, he tenido recientemente problema similar con la actualización gstatusbar antes y después de la operación de largo. Si bien existe una alternativa a REPL llamada REventLoop, he encontrado el uso del temporizador tcl bastante útil.

tcl("after", 300, my_long_operation) 

Así que actualizar gstatusbar antes de la operación de largo, a continuación, configurar el temporizador que en menos de un segundo se disparará mi función que toma un tiempo, y al final de esa función actualizo gstatusbar usando algo como

svalue(sb) <- "Ready" 
Cuestiones relacionadas