2017-10-25 1 views
0

Ich möchte eine Tabelle in Tcl/Tk GUI erstellen. Die minimale Größe aller Felder der Tabelle ist (x = 10, y = 2) und wenn irgendwelche Wörter (die in ein Feld eingefügt werden) die Größe des Kästchens überschreiten, wird es in Richtung der Y-Achse angepasst. Bitte helfen Sie mir.Einstellen der minimalen und maximalen Größe einer Tabelle in TCL

Ich habe mit diesem Code versucht:

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 123456789} 
} 

pack .t 

Die Zieltabelle wird so sein:

A screen shot is here of the table

+0

Nun hängt ab, wie die Tabelle erstellt wird. Verwenden Sie beispielsweise das Standard-Tabellenlisten-Paket? – Jerry

+0

Ja @Jerry, ich habe die Details der Tabellistencodes im Fragenhauptteil aktualisiert. Bitte überprüfen Sie es und helfen Sie mir. –

+0

Das ist nicht wirklich ein Tabellen-Widget, es ist eine provisorische Anordnung von Etiketten. Wie auch immer, was ist, wenn der Text zu lang ist, um in den 2 Zeilen enthalten zu sein? Und wenn der Text zwischen 10 und 20 Zeichen groß ist, aber keine Leerzeichen enthält? – Jerry

Antwort

0

ich folgendes vorschlagen. Es ist nicht für den Fall vorgesehen, wenn ein Wort in einem Satz länger als die maximale Spaltengröße ist, aber ansonsten funktioniert es. Es wird ein Zeilenumbruch durchgeführt, wenn der Text ein Satz ist (hat ein Leerzeichen darin), oder der Zeilenumbruch ist anders.

Beachten Sie, dass Zeichenumbruch immer noch wirksam wird, wenn ein Wort mit einer Länge vorhanden ist, die die maximale Größe einer Spalte überschreitet.

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 123456789} 
    {4 fgh 1234567890987654321} 
    {5 ijk "Data Bits per Mask"} 
} 

pack .t 

Ausgang:

enter image description here

+0

Vielen Dank @Jerry. –

Verwandte Themen