在TCL中调整表的最小和最大大小

时间:2017-10-25 10:21:26

标签: user-interface tcl tk tabular

我想在Tcl / Tk gui中创建一个表。表的每个框的最小尺寸将是(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

目标表将如下所示:

A screen shot is here of the table

1 个答案:

答案 0 :(得分:0)

我建议如下。它不适用于句子中的单词长于最大列大小的情况,但它不起作用。如果文本是一个句子(在其中有空格),或者字符换行,它将自动换行。

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

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

输出:

enter image description here