我正在尝试使用gWidgetsRGtk2
为我用R编写的程序创建一个GUI。我的GUI有一个gedit()
文本框,用户可以在其中键入输入数据的文件路径要放入程序的文件。它还有一个“浏览”按钮,单击该按钮可打开gfile()
框,以便他们可以浏览他们想要的文件。我遇到的问题是在用户使用“浏览”按钮选择文件后更新gedit()
框中的值。下面的代码可能会更清楚:
dir <- getwd()
sfilepath <- paste0(dir,"/")
win = gwindow("Set Parameters:",width=400,height=550)
nb = gnotebook(cont=win)
tab2 <- glayout(cont=nb, label = "Advanced Settings")
tab1 <- glayout(cont=nb, label = "Basic Settings")
tab1[2,2] <- glabel("BD:",cont=tab1)
tab1[2,4:5] <- gedit(1,cont=tab1)
addhandlerkeystroke(tab1[2,4],handler=function(h,...){BD <<- as.numeric(svalue(h$obj))})
tab1[3,2:5] <- gseparator(cont=tab1)
tab1[4,2:5] <- glabel("File path:",cont=tab1)
tab1[5,2:4] <- gedit(paste0(dir,"/"),cont=tab1)
tab1[5,5] <- gbutton(text="Browse", handler=function(h,...){ gfile("Select a file",type="open", filter = list("text files" = list(patterns = c("*.csv","*.txt")), "R files" =list(patterns = c("*.R","*.Rdata"))), handler = function(h,...){ sfilepath <<- h$file},cont=TRUE)},cont=tab1)
addhandlermousemotion(tab1[5,2],handler=function(h,...){svalue(h$obj) <- sfilepath})
到目前为止,我已尝试使用addhandlermousemotion
,如上面的代码所示,因此gedit()
框中的文本仅在您将鼠标移到框本身时才会更新。但是,如果框中的文字立即更新,我会更喜欢它。
我也尝试使用addhandleridle()
,间隔为1秒,以便框中的文字每1秒自动更新一次。这很有效。但是,它使得无法正确输入框,因为文本框在保存正在键入的新“文件路径”之前使用旧的“sfilepath”进行更新。
我是GUI的初学者(我已经编写了一个工作程序,但是一旦我离开就需要其他人使用,所以上周五决定我应该弄清楚如何将它变成GUI) 。因此,非常感谢任何人提供的任何帮助。
答案 0 :(得分:2)
这是您想要的模式(将处理程序传递给gfilebrowse):
w <- gwindow("test")
g <- ggroup(cont=w, horizontal=FALSE)
file_upload <- gfilebrowse(cont=g, handler=function(h,...) {
svalue(e) <- svalue(h$obj)
})
e <- gedit("", cont=g)