2

我正在尝试为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”之前,文本框已使用旧的“sfilepath”更新。

我是 GUI 制作的初学者(我已经编写了一个工作程序,但是一旦我离开它就需要其他人使用,所以上周五决定我应该弄清楚如何将它制作成 GUI)。因此,任何人都可以提供的任何帮助将不胜感激。

4

1 回答 1

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)
于 2013-02-07T00:46:45.990 回答