1

別のトップレベル内のルート トップレベルの子であるウィジェット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ん。gridplace


編集:私がやっていることについての詳細

トップレベルの作成を自動化する snit ウィジェットを構築しようとしています。私が通常行うことの 1 つは、ttk::frame作成するすべてのトップレベルの内部に配置し、pack ... -fill both -expand trueコマンドを使用してそれを管理することです。

私のスニジェットは常にそれを行う必要がありますが、実装を変更しても既存のコードが壊れないように、ユーザーの観点からは隠したいと思います。

簡単な方法はこれです

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スニジェットを使用して、トップレベルのビルド内にボタンを取得します。

4

2 に答える 2