1

画面全体を左から右に塗りつぶすフレーム (ボーダーレリーフのため) と、その中のウィジェットを左側に貼り付けたいと考えています。しかし-sticky nswe、フレームと-sticky nswウィジェット自体を配置すると、フレームはウィンドウ全体を占有しますが、ウィジェットはフレームの左端ではなく、フレームの中央の左側に配置されます。

ここに画像の説明を入力

そして、私はそれを次のようにしたい(ペイントで作成):

ここに画像の説明を入力

そして、それを作成するコードは次のとおりです(ファイル拡張子を含む上部フレームの場合):

編集:コードをさらに追加し、列と行の番号付けの問題を修正しました

proc eyes_view_create_file_extention_bar {frm_main listOfPossibleExtensions} {
    #Files Extention Bar
    set files_cb ::eyes_view_file_ext_arr_cb
    grid [set file_frm [frame $frm_main.file_frm -relief groove -bd 2]] -row 0 -column 0 -columnspan 2 -sticky nswe
    set file_lbl [label $file_frm.lbl -text "File Extenctions to Show:"]
    set columns 0
    foreach file_ext $listOfPossibleExtensions {
        set cb [checkbutton $file_frm.[regsub -all {\.} $file_ext {}] -text $file_ext -variable ${files_cb}(${file_ext}) -command [list _eyes_view_update]]
        set ${files_cb}(${file_ext}) 0
        grid $cb -row 1 -column $columns -sticky wsn
        incr columns
    }
    grid $file_lbl -row 0 -columnspan $columns -sticky wsn    
}

proc eyes_view_main_widget {base listOfExternalVarsAndValues listOfPossibleExtensions} {

    wm title $base "Eyes Viewer"
    array set [set files_cb ::eyes_view_file_ext_arr_cb] {}
    array set [set vars_cb ::eyes_view_vars_arr_cb] {}
    set frm_main [frame  $base.main_frm]
    pack $frm_main -expand 1 -fill both

    #graph
    set g_frm [frame $frm_main.graph]
    grid $g_frm -row 2 -column 1 -sticky nsew
    set g [eyes_graph_widget $frm_main.graph graph]
    #splits table

    grid [set split_frm [frame  $frm_main.tbl_split]] -row 2 -column 0 -sticky nswe
    set apply_button    [button $split_frm.apply -text "Apply" -command [list _eyes_view_update]]
    set split_tbl_frm   [frame  $split_frm.tbl_frm]

    set split_table [sparam_table_widget $split_tbl_frm split_table]

    #file extensions frame, vars frame & legend
    set file_frm [eyes_view_create_file_extention_bar $frm_main $listOfPossibleExtensions]
    set var_frm  [eyes_view_create_vars_values_bar $frm_main $listOfExternalVarsAndValues]
    set legend_frm [eyes_view_create_legend_frame $frm_main]

    grid $split_tbl_frm -row 0 -sticky nwse
    grid $apply_button  -row 1 -sticky nwse

    grid columnconfigure $frm_main 0 -weight 0
    grid columnconfigure $frm_main 1 -weight 1
    grid rowconfigure    $frm_main 0 -weight 0
    grid rowconfigure    $frm_main 1 -weight 0
    grid rowconfigure    $frm_main 2 -weight 1
    grid rowconfigure    $frm_main 3 -weight 0

    grid rowconfigure    $split_frm 0 -weight 1
    grid rowconfigure    $split_frm 1 -weight 0
    ...
    return [list $g $split_table $legend_frm $frm_main]
}
4

2 に答える 2

2

親ウィンドウ ($frm_main) に、ジオメトリの変更をその子に伝達する方法を伝える必要があります。この場合、おそらく次のことが必要です。

grid columnconfigure $frm_main 1 -weight 1
grid rowconfigure $frm_main 1 -weight 1

これは、親のサイズが変更されたときに行 1 列 1 に新しいスペースを与えることを示しています。これに関するドキュメントを注意深く読んで、さまざまな色 (frame .f -background red など) の単純なフレームを使用して、グリッドがどのように機能するかを理解することをお勧めします。

この例でも、配列の処理が壊れています。-variable オプションは変数名を取るので-variable files_cb($file_ext)、配列値を設定しようとするときに逆参照したくないだけです。set files_cb($file_ext) 0代わりに試してください。

于 2012-12-10T16:25:43.803 に答える
1

問題を再現できませんでした。すべての変数を修正した後、まさにあなたが望む動作を得ました。おそらく、これは完全なスクリプトではなく、省略されている部分で何かが起こっているためです。とにかく、次のことを試してください。

変化する

grid $file_frm -row 1 -column 1 -columnspan 2 -sticky nswe

grid $file_frm -row 1 -column 1 -columnspan 2 -sticky nswe
grid anchor $file_frm w
于 2012-12-10T16:26:44.637 に答える