gcombobox(与Gtk2)事件循环

时间:2013-03-26 14:17:48

标签: r gwidgets

以下代码显示将项目向量分配给gcombobox将导致在现有项目向量的每个元素上循环gcombobox处理程序(尝试点击,例如"a""b",您会看到来自gcombobox的多条打印消息。如果b2更改为gradio按钮,则不会发生此循环。此外,如果使用tcltk工具包,那么我们也没有问题。这在GUI中导致问题,其中b2的处理程序更复杂并且操纵一些大数据。任何阻止这种循环的建议都会很棒!

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

w=gwindow()
b1=gradio(c("a","b"),container=w)
b2=gcombobox(c(1:2),container=w)
addHandlerClicked(b1,handler=function(h,...) b2[,]=c(1:10))
addHandlerClicked(b2,handler=function(h,...) print("clicked b2"))

1 个答案:

答案 0 :(得分:0)

您可以阻止处理程序然后取消阻止,如下所示:

w=gwindow()
b1=gradio(c("a","b"),container=w)
b2=gcombobox(c(1:2),container=w)
id = addHandlerClicked(b2,handler=function(h,...) print("clicked b2"))
addHandlerClicked(b1,handler=function(h,...) {
  blockHandler(b2, id)
  b2[,]=c(1:10)
  unblockHandler(b2, id)
})

我翻转了赋值顺序以获取处理程序ID。

或者,在gWidgets2中(仍然只在Github上)它只是起作用,因为b2的可选项的这种分配不是设置b2的选定值。 (您可能需要手动完成)

options("guiToolkit"="RGtk2")
library(gWidgets2)

w=gwindow()
g = ggroup(cont=w)  ## only one child for a gwindow instance is enforced
b1=gradio(c("a","b"),container=g)
b2=gcombobox(c(1:2),container=g, expand=TRUE)
id = addHandlerChanged(b2,handler=function(h,...) print("clicked b2"))
addHandlerChanged(b1,handler=function(h,...) {
  b2[]=c(1:10)
})