在Tcl / Tk中下拉文本框

时间:2015-04-16 12:26:20

标签: 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
    
  3. 现在,在没有关闭GUI的情况下添加水果后,我怎样才能在下拉框中找到它?

1 个答案:

答案 0 :(得分:0)

这是一个代码段(代码更改尽可能少),它使用了一个组合框并为其添加了水果:

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,这样可以更轻松地进行检索和更新。