在 Tcl/Tk 中下拉文本框

Drop down textbox in Tcl/Tk

  1. 这是一个数据库:

    apple     20
    mango     45
    banana    30
    

    我想在下拉文本框中获取这些水果的名称。


  2. 我有一个文本字段可以将水果名称添加到数据库中。

    label .l1 -text "Fruits :" 
    entry .e1
    pack .l1 .e1
    label .l2 -text "Store :"
    entry .e2
    pack .l2 .e2
    button .b1 -text "OK" -command save
    pack .b1
    
    proc save {} {
        set fpR [read [open "abcd.txt"]]
        set fp [open "abcd.txt" w]
        puts $fp "$fpR\n[.e1 get]   [.e2 get]"
    }
    

    在不关闭 GUI 的情况下添加新数据后:

    apple     20
    mango     45
    banana    30
    guava     10
    

现在,在不关闭 GUI 的情况下添加水果后,如何在下拉框中获取它?

这是一个使用组合框并向其中添加水果的代码片段(尽可能少地更改您的代码):

package require Tk

ttk::combobox .combo
pack .combo

# Set up proc to populate combobox
proc refresh_combo {} {
  # Set up channel to read file
  set fin [open abcd.txt r]
  # Get all fruit names in a single list
  set fruitList [lmap x [split [read $fin] "\n"] {if {$x != ""} {lindex $x 0} else {continue}}]
  close $fin
  .combo configure -values $fruitList
}

refresh_combo

label .l1 -text "Fruits :" 
entry .e1
pack .l1 .e1
label .l2 -text "Store :"
entry .e2
pack .l2 .e2
button .b1 -text "OK" -command add_fruits
pack .b1

proc add_fruits {} {
    # Open file to append new fruits
    set fp [open "abcd.txt" a]
    puts $fp "[.e1 get]   [.e2 get]"
    close $fp
    refresh_combo
}

尽管在文本文件中用制表符分隔值(或其他适当的分隔符)可能会更好。如果你真的想要一个数据库,你可能会研究 sqlite 这使得检索和更新更容易。