从R中的TclTk GUI返回变量

时间:2016-09-16 01:21:17

标签: r tcl tk

我已经按照TclTk示例创建了一个列表框,让用户选择他们喜欢的水果(参见下面的代码)。该示例打印用户的选择,就是这样。但是,我希望稍后在我的脚本中使用该选项来做各种事情(在剧情标题,文件名等中使用它)。如何将用户选择从TclTk GUI返回到我的其余脚本?

library(tcltk2)

win1 <- tktoplevel()
win1$env$lst <- tk2listbox(win1, height = 4, selectmode = "single")
tkgrid(tk2label(win1, text = "What's your favorite fruit?", justify = "left"),
padx = 10, pady =c(15, 5), sticky = "w")
tkgrid(win1$env$lst, padx = 10, pady = c(5, 10))
fruits <- c("Apple", "Orange", "Banana", "Pear", "Apricot")
for (fruit in fruits)
  tkinsert(win1$env$lst, "end", fruit)
# Default fruit is Banana.  Indexing starts at zero.
tkselection.set(win1$env$lst, 2)

onOK <- function() {
  fruitChoice <- fruits[as.numeric(tkcurselection(win1$env$lst)) + 1]
  tkdestroy(win1)
  msg <- paste0("Good choice! ", fruitChoice, "s are delicious!")
  tkmessageBox(message = msg)
}
win1$env$butOK <-tk2button(win1, text = "OK", width = -6, command = onOK)
tkgrid(win1$env$butOK, padx = 10, pady = c(5, 15))

2 个答案:

答案 0 :(得分:1)

  

如何将用户选择从TclTk GUI返回到我的其余脚本?

这取决于你想做什么

选项1:

如果您不再需要GUI,则在从R变量中的GUI中提取所选设置后将其销毁。这正是您在onOK“事件处理程序”函数中所做的。

您应该添加以下R命令以等待tcltk窗口 在此行之后继续执行R代码之前关闭:

# Wait for the window to be closed
tkwait.window(win1)

然后,您可以在业务逻辑e中使用R变量中的值(从事件处理函数中的GUI设置填充)。 G。通过在代码末尾添加业务逻辑代码:

choice <- tkmessageBox(message=paste("Do you want to buy", fruitChoice, "now?"), type = "yesno", icon="question")

选项2:

您的业务逻辑在事件处理函数中触发(执行)(不破坏/关闭窗口),以可视化业务逻辑的输出(“状态更改”)。

在这个GUI驱动的范例中,您可以直接将业务逻辑代码添加到事件处理函数中,而无需调用tkdestroy

要关闭窗口,请添加“退出”,“关闭”,“取消”...按钮。在这些按钮的事件处理函数中,您可以调用tkdestroy

答案 1 :(得分:0)

列表框中有命令参数可用(需要知道您用于创建它的包)。例如,有一个参数“-selectioncommand”。您可以设置命名空间变量来访问所选值。

例如-selectioncommand {set :: xyz :: test}这应该在创建小部件时使用。