0

次のコードは、アイテムベクトルをに割り当てると、既存のアイテムベクトルの各要素でハンドラーgcomboboxがループすることを示していgcomboboxます(たとえば、をクリックしてみると、"a"から"b"の複数の印刷メッセージが表示されますgcombobox)。b2がボタンに変更された場合gradio、このループは発生しません。また、tcltkツールキットを使用している場合も問題はありません。これは、のハンドラーb2がより複雑で、いくつかの大きなデータを操作するGUIで問題を引き起こしています。このループを防ぐための提案は素晴らしいでしょう!

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 に答える