调整 TCL 中 a table 的最小和最大大小

Adjust minimum and maximum size of a table in TCL

我想在 Tcl/Tk gui 中创建一个 table。 table 中每个框的最小尺寸为 (x=10, y=2) 并且如果任何单词(插入任何框内)超过框的尺寸,那么它将向 Y 轴调整。 请帮我。

我试过这个代码:

proc table {w content args} {
    frame $w -bg black
    set r 0
    foreach row $content {
        set fields {}
        set c 0
        foreach col $row {
            lappend fields [label $w.$r/$c -text $col]
            incr c
        }
        eval grid $fields -sticky news -padx 1 -pady 1
        incr r
    }
    set w
}

#--- Test:

table .t {
    {Row Head1 Head2}
    {1   abc   123123}
    {2   bcd   12341234}
    {3   cde   12345678901234567890}
}

pack .t

目标table会是这样的:

我建议如下。它不适合句子中的单词长于最大列大小的情况,但它适用于其他情况。如果文本是一个句子(其中有一个 space),它将自动换行,否则将自动换行。

请注意,如果单词的长度超过列的最大长度,字符换行仍然会生效。

package require Tk

proc wrap {text len} {
  if {[string len $text] <= $len} {
    # No need for wrapping
  } else {
    if {[string first " " $text] > -1} {
      # Word wrap
      set flag "\M"
    } else {
      # Character wrap
      set flag ""
    }
    set re "^.{1,$len}$flag"
    set result [list]
    while {1} {
      regexp $re [string trim $text] res
      regsub $re [string trim $text] "" text
      lappend result $res
      if {$text eq ""} {break}
    }
    set text [join $result \n]
  }
  return $text
}

proc table {w content args} {
  frame $w -bg black
  set r 0
  foreach row $content {
    set fields {}
    set c 0
    foreach col $row {
      set text [wrap $col 10]
      lappend fields [label $w.$r/$c -text $text]
      incr c
    }
    eval grid $fields -sticky news -padx 1 -pady 1
    incr r
  }
  set w
}

table .t {
  {Row Head1 Head2}
  {1   abc   123123}
  {2   bcd   12341234}
  {3   cde   12345678901234567890}
  {4   fgh   123456789098765432101234567890}
  {5   ijk   "Data Bits per Mask"}
}

pack .t

输出: