0

下面的代码显示分配一个项向量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"))
4

1 回答 1

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)
})
于 2013-03-26T21:33:12.160 回答