Tcl/Tk中使用window create end无法创建组件层级的问题求助
Tcl/Tk文本组件嵌入组件时的层级错误解决
正常运行的代码
以下代码可生成预期界面(红色背景容器内包含顶部按钮和左下方标签,整体置于灰色文本组件中):
#!/bin/ash # \ exec tclsh $0 "$@" package require Tk wm withdraw . toplevel .top pack [frame .top.frmBase0 -bg white] -side top -anchor center -fill both -expand true -padx 0 -pady 0 set frame .top.frmBase0.palco text $frame -borderwidth 0 -highlightthickness 0 -relief flat -bg #efefef pack $frame -side right -anchor nw -fill both -expand true -ipadx 10 -ipady 0 pack [frame $frame.pnl0 -bg darkred] -side left -anchor nw -padx 5 -pady 5 pack [button $frame.pnl0.btn0 -text "Lorem ipsum"] -side top -anchor center pack [label $frame.pnl0.lbl0 -text "String" -justify left -bg darkred -fg whitesmoke -font {-family courier -size 8 -weight bold}] -side left -anchor nw -padx 5 -pady 5 $frame.pnl0.btn0 config -highlightbackground [$frame.pnl0 cget -background]
问题代码与错误原因
尝试改用text window create嵌入组件时出现错误,核心问题是:Tk组件只能被一种几何布局管理器(pack/grid/place)管理。原问题代码中先通过pack布局了$frame.pnl0,随后又试图用text window create将其嵌入文本组件,导致布局冲突。
问题代码片段(错误部分):
# 先通过pack管理pnl0,后续又用text window create嵌入,产生冲突 pack [frame $frame.pnl0 -bg darkred] -side left -anchor nw -padx 5 -pady 5 # ... $frame window create end -window $frame.pnl0 -padx 20 -pady 20 -stretch 1 $frame window create end -window $frame.pnl0.btn0 $frame window create end -window $frame.pnl0.lbl0
修正后的代码
移除对$frame.pnl0的pack操作,仅让文本组件的window create管理它的位置;内部的按钮和标签仍可通过pack布局在pnl0容器内:
#!/bin/ash # \ exec tclsh $0 "$@" package require Tk wm withdraw . toplevel .top pack [frame .top.frmBase0 -bg white] -side top -anchor center -fill both -expand true -padx 0 -pady 0 set frame .top.frmBase0.palco text $frame -borderwidth 0 -highlightthickness 0 -relief flat -bg #efefef pack $frame -side right -anchor nw -fill both -expand true -ipadx 10 -ipady 0 # 不使用pack布局pnl0,留待text组件嵌入 frame $frame.pnl0 -bg darkred # 正常布局pnl0内部的按钮和标签 button $frame.pnl0.btn0 -font {-family courier -size 12 -weight bold} -text "Lorem ipsum" $frame.pnl0.btn0 config -highlightbackground [$frame.pnl0 cget -background] pack $frame.pnl0.btn0 -side top -anchor center label $frame.pnl0.lbl0 -text "String" -justify left -bg darkred -fg whitesmoke -font {-family courier -size 8 -weight bold} pack $frame.pnl0.lbl0 -side left -anchor nw -padx 5 -pady 5 # 将pnl0容器嵌入到文本组件中,内部组件会一并显示 $frame window create end -window $frame.pnl0 -padx 20 -pady 20 -stretch 1
说明:修正后,pnl0仅由文本组件的嵌入机制管理位置,内部子组件由pack布局,避免了布局管理器冲突,同时保留了原界面的结构。
内容的提问来源于stack exchange,提问作者Diego Henrique
相关产品推荐
相关产品推荐

