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 <Configure> {after 300 rewrap}
wm title . "Short Question"