我正在尝试pack
(或place
)一个小部件,它是另一个顶层内的根顶层的子级,它本身.
就是一个子级.
。那是,
% toplevel .tl
.tl
% frame .f
.f
% pack .f -in .tl
can't pack .f inside .tl
但是,我发现这段代码几乎可以工作:
% frame .tl
.tl
% frame .f
.f
% pack .f -in .tl
% wm manage .tl
我说差不多,因为.f
是不可见的。这有点奇怪,因为如果我在里面放一个按钮.f
,比如
button .f.b -text FooBar
pack .f.b
我看到几何管理器保留的空白空间,但看不到任何小部件。
我确定我做错了什么,但我不知道是什么以及为什么,并且pack
,grid
和place
手册页没有帮助。
编辑:关于我在做什么的一些细节
我正在尝试构建一个 snit 小部件,它可以自动执行一些顶级创建内容。我通常做的一件事是在ttk::frame
我创建的每个顶层中放置一个,并使用pack ... -fill both -expand true
命令对其进行管理。
我的 snidget 应该总是这样做,但我想从用户的角度隐藏它,以便对实现的任何更改都不会破坏现有代码。
简单的方法是这样
snit::widget Toplevel {
hulltype toplevel
component f
constructor {args} {
set f [ttk::frame $self.f -padding 2]
pack $f -fill both -expand 1
$self configurelist $args
}
}
但用户必须了解该f
组件,并创建其他小部件作为它的子级。
所以,我尝试了另一种解决方案:我使用一个ttk::frame
小部件作为船体类型,然后构建船体的同级顶层,并尝试将船体放入顶层。
我尝试的代码类似于以下内容:
snit::widget Toplevel {
hulltype ttk::frame
component tl
constructor {args} {
set segments [split $self .]
set wname [join [lreplace $segments end end _[lindex $segments end]] .]
set tl [frame $wname -width 100 -height 100]
pack $self -in $tl -fill both -expand 1
wm manage $tl
$self configurelist $args
}
}
如果它按预期工作,用户可以编写如下内容:
% Toplevel .t
.t
% button .t.b -text Foobar
.t.b
% pack .t.b
.t
并会使用 snidget在顶层构建中获得一个按钮。