我该怎么做才能对抗Gtk-CRITICAL错误?

时间:2013-01-26 06:26:44

标签: r gwidgets

我正在编写一个小型数据库界面,并希望使用glayout。 MWE:

require(gWidgets)
options("guiToolkit"="RGtk2")

###   The bowl
win     <- gwindow( "Fruits")
gui     <- glayout( container = win )

###   Fruit salad
gui[1,1] <- glabel( "Apple", cont = gui )
gui[1,2] <- gbutton( "Change", cont = gui )

nav1 <- function( gui )
{
  svalue( gui[1,1] ) <- "Banana" 
}

addHandlerClicked( gui[1,2], handler = function( h, ... )
{ 
  nav1( gui )
})

功能似乎存在,但我收到错误(或者是警告?)消息

(R:14953): Gtk-CRITICAL **: IA__gtk_table_attach: assertion `child->parent == NULL' failed

我用rseek(没有)和谷歌寻找解决方案(没有任何我能解决的具体问题)。任何想法我可以做什么来摆脱消息?或者我可以放心地忽略它们吗?

sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-pc-linux-gnu (64-bit)
...       
other attached packages:
[1] gWidgetsRGtk2_0.0-81 

2 个答案:

答案 0 :(得分:5)

就在这一行:

svalue( gui[1,1] ) <- "Banana"

你得到错误。如果你将其分解为两个步骤:

tmp <- gui[1,1]
svalue( tmp ) <- "Banana" 
它消失了。这必须与R如何使用替换函数创建副本有关,但gui [1,1]引用的小部件是一个指针。无论如何,不​​太确定。

答案 1 :(得分:1)

基于John的解决方案(非常感谢......),我进行了一些实验,发现创建包含索引小部件的列表可以解决问题。它还避免了当有许多小部件时可能令人讨厌的临时分配。

###   The bowl
win     <- gwindow( "Fruits")
gui     <- glayout( container = win )

###   Fruit salad  
tmp <- list(
  t1 = gui[1,1] <- glabel( "Apple", cont = gui ),
  t2 = gui[1,2] <- gbutton( "Change", cont = gui ) )

nav1 <- function( tmp )
{
  svalue( tmp$t1 ) <- "Banana" 
}

addHandlerClicked( tmp$t2, handler = function( h, ... )
{ 
  nav1( tmp )
})