R - 根据在下拉列表 (ttkcombobox) 中选择的值更新文本输入框 (tkentry)

R - Update text entry box (tkentry) based on value selected in dropdown (ttkcombobox)

我对 R 和 tcltk/GUI 编程还是很陌生。

这是一个简单的 GUI,我希望根据用户从下拉菜单中选择的内容,将文本输入框更改为不同的值。

我已经尝试寻找答案,但我只找到了提示(tkbind、tkafter),这不足以让我知道如何实际编写代码。

这是怎么做到的?

非常感谢!

更新 - 找到解决方案 - tkbind 和 tkconfigure 的组合 - 向下滚动到代码末尾附近,我已经用一个有效的解决方案更新了它。

UPDATE2 - 好的,所以尽管这似乎有效,但它破坏了我后来的代码并且在按下 "OK" 按钮后实际上并没有使用这些值。在下面添加了该代码。有任何想法吗?即 VariableToUse 始终保持在 10,即使我稍后在选择组合框值时在代码中将其设置为 1。

更新 3 - 好的,也修复了这个问题!这是我在其他地方读到的 "level" 东西——我只需要使用 <<- 而不是 <-。代码更新如下。

if (!require("tcltk2")) {
  install.packages("tcltk2", dependencies = TRUE)
  library(tcltk2)
}

#########################################################
### Parameters
#########################################################
MyEditBox <- tclVar(10)
# Default selection in dropdown
MyComboBox <- tclVar(1)
# Ok button
ret_var <- tclVar("")

#########################################################
### Button functions
#########################################################

submit <- function() {
  tclvalue(ret_var) <- "OK"
  tkdestroy(tt)
}

quit <- function() {
  tkdestroy(tt)
}


#########################################################
### BUILD GUI
#########################################################

## head line
tt <- tktoplevel(borderwidth = 20)
tkwm.title(tt, "ComboBox Test")

if(.Platform$OS.type == "windows"){
  box_length <- 63
}else{
  box_length <- 55
}
cell_width <- 3
bt_width <- 8

# Dropdown box
comboBox <- ttkcombobox(tt,values=c(1,2,3), textvariable = MyComboBox)

# Box1
box1 <- tkentry(tt, textvariable = MyEditBox, width = 6)


## submit / reset / quit 
submit_button <- tkbutton(tt, text = "Go ...", command = submit)
quit_button <- tkbutton(tt, text = "Quit", command = quit)


#########################################################
### Display GUI
#########################################################

tkgrid(tklabel(tt, text = ""),tklabel(tt, text = "Select a value:"))


tkgrid(tklabel(tt, text = "\n"), padx = cell_width)  # leave blank line

tkgrid(tklabel(tt, text = "Select Something:"), comboBox, padx = cell_width)

tkgrid(tklabel(tt, text = "\n"), padx = cell_width)  # leave blank line

tkgrid(tklabel(tt, text = "Box To Update:"), box1, padx = cell_width)
tkgrid(tklabel(tt, text = "\n"), padx = cell_width)  # leave blank line

### Go and Quit buttons
tkgrid(tklabel(tt, text = ""), submit_button, quit_button, padx = cell_width)

tkgrid.configure(quit_button, sticky = "w")

    tkbind(comboBox, "<<ComboboxSelected>>", function() {
       if (tclvalue(MyComboBox)==1){      
       # Change the value           
       MyEditBox <<- tclVar(1)
       # Update the GUI
       tkconfigure(box1,textvariable = MyEditBox)
      }
    })

tkwait.window(tt)


########################
### Go button pressed
########################

if (tclvalue(ret_var) == "OK") {
  VariableToUseLater <- tclvalue(MyEditBox)
}

好的,我找到了我需要的命令:

# Set the value
MyEditBox <<- tclVar(1)
# Show in GUI
tkconfigure(box1, textvariable=MyEditBox)