Labels are packed as table. The left column is fixed width, the right column wraps text when the window is resized. Text in left column is top aligned. ====== package require Tk catch {destroy {*}[winfo children .]} # create proc labeltext_wraps proc label_wrap {w font} { label $w -text 123 -width 1 -wraplength 3 -font $font set tags [font metrics [$w cget -font]] set pix_per_line [dict get [font metrics [$w cget -font]] -linespace] set h [winfo reqheight $w] set offset [expr {$h - 3*$pix_per_line}] list proc labeltext_wraps w "expr {((\[winfo reqheight \$w\]-$offset)/$pix_per_line)-1}" } proc resize_label {label_source label_dest} { set wraps [labeltext_wraps $label_source] #puts "$label_source has $wraps wraps" set text [$label_dest cget -text] set head [regsub {\n*$} $text {}] append head [string repeat \n $wraps] $label_dest configure -text $head return } proc rewrap {} { set w [winfo width .k._c.col1] .k._c.col1.row0.text0 configure -wraplength $w .k._c.col1.row1.text1 configure -wraplength $w resize_label .k._c.col1.row0.text0 .k.col0.actor0 resize_label .k._c.col1.row1.text1 .k.col0.actor1 } # text source: http://www.karl-valentin.de/valentin/anekdoten.htm # purpose: align labels when wraplength changes # resize the window set initial_width 300 #. frame .k avoids gap between col0, col1 frame .k -bg {} frame .k.col0 -bg {} set s0 "A man spoke to Valentin:" set s1 " Then the comedian:" label .k.col0.actor0 -text $s0 -justify right -font {{Noto Mono} 20} -bg bisque -bd 4 label .k.col0.actor1 -text $s1 -justify right -font {{Noto Mono} 20} -bg bisque -bd 4 pack .k.col0.actor0 .k.col0.actor1 -side top -expand 1 -fill y -anchor e # required to get left alignment where text is centered when not wrapped frame .k._c -bg {} frame .k._c.col1 -bg {} # frame row required, to have text justified left, frame fill takes the rest frame .k._c.col1.row0 -bg {} ;#blue label .k._c.col1.row0.text0 -text "\"You, something occurs to me that I've wanted to ask you for a long time.\"" -justify left -wraplength $initial_width -bg aliceblue -font {Symbola 20} -bd 4 frame .k._c.col1.row0.fill -bg pink pack .k._c.col1.row0.text0 -side left -fill y -expand 1 -anchor w pack .k._c.col1.row0.fill -side right -fill both -expand 1 -anchor e pack .k._c.col1.row0 -side top -fill both -expand 1 frame .k._c.col1.row1 -bg {} ;#blue label .k._c.col1.row1.text1 -text "\"Just ask, I've wanted to answer that for a long time.\"" -justify left -wraplength $initial_width -bg aliceblue -font {Symbola 20} -bd 4 frame .k._c.col1.row1.fill -bg pink pack .k._c.col1.row1.text1 -side left -fill y -expand 1 -anchor w pack .k._c.col1.row1.fill -side right -fill both -expand 1 -anchor e pack .k._c.col1.row1 -side top -fill both -expand 1 pack .k.col0 -side left -fill y -expand 1 pack .k._c.col1 -side left -fill both -expand 1 -anchor w pack .k._c -side left -fill both -expand 1 -anchor w pack .k -fill both -expand 1 set dproc [label_wrap .invisible {Symbola 20}] # generate proc labeltext_wraps #puts dproc=<$dproc> eval $dproc bind .k._c.col1 {after 300 rewrap} wm title . "Short Question" ======