2013-03-26 34 views
0

下面的代碼示出了分配的項目向量gcombobox將導致gcombobox處理程序在現有的項目向量的每個元素的循環(嘗試一下,例如,"a""b"和你」我會看到來自gcombobox的多個打印消息)。如果b2更改爲gradio按鈕,則不會發生此循環。另外,如果使用tcltk工具包,那麼我們也沒有問題。這對於我在GUI中導致的問題,其中b2的處理程序更復雜並且操縱一些大數據。任何防止這種循環的建議都會很棒!gcombobox(與Gtk2的視覺)事件循環

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

回答

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) 
}) 
+0

謝謝你的工作!我不知道(un)blockHandler。這會派上用場,因爲我在GUI中有幾個令人費解的小部件。在gWidgets中,處理程序只能在小部件選擇時才執行,而不是部件分配?再次感謝你的幫助。 – user2211814 2013-03-27 11:10:47

+0

是的,在gWidgetsRGtk2中,當您將新項目分配給組合框時,嘗試將值設置爲舊值。這對程序員來說很方便。在您的示例中,可以完成此選擇,以便進行選擇。我沒有在gWidgets2RGtk2中做到這一點 - 我現在同意最好能有你描述的行爲。 – jverzani 2013-03-27 20:09:56