2

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

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

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

这是怎么做到的?

非常感谢!

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

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

UPDATE3 - 好的,也修复了!这是我在其他地方读到的“级别”的东西——我只需要使用 <<- 而不是 <-。代码更新如下。

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)
}
4

1 回答 1

1

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

# Set the value
MyEditBox <<- tclVar(1)
# Show in GUI
tkconfigure(box1, textvariable=MyEditBox)
于 2019-12-20T13:29:23.287 回答