1

あらゆる種類のオプションを試しましたが、2 つ以上のリストボックスに単純なスクロールバーを実装することに成功しませんでした。以下は、スクロール中にエラーが発生するコードです。皆さんが私を助けてくれることを願っています...

scrollbar .scroll -orient v
pack .scroll -side left -fill y
listbox .lis1
pack .lis1 -side left 
listbox .lis2
pack .lis2 -side left 

for {set x 0} {$x < 100} {incr x} {
 .lis1 insert end $x
 .lis2 insert end $x
}
.lis1 configure -yscrollcommand [list .scroll set]
.lis2 configure -yscrollcommand [list .scroll set]
.scroll configure -command ".lis1 yview .lis2 yview ";

ありがとうございます。

4

3 に答える 3

1

Tcler の wikiに多数の例がありますが、中心的な原則は、スクロール プロトコルがウィジェット間で確実に同期されるようにするための手順を使用することです。そのwikiページに基づいた例を次に示します。

# Some data to scroll through
set ::items [lrepeat 10 {*}"The quick brown fox jumps over the lazy dog."]

# Some widgets that will scroll together
listbox .list1 -listvar ::items -yscrollcommand {setScroll .scroll}
listbox .list2 -listvar ::items -yscrollcommand {setScroll .scroll}
scrollbar .scroll -orient vertical -command {synchScroll {.list1 .list2} yview}

# The connectors
proc setScroll {s args} {
    $s set {*}$args
    {*}[$s cget -command] moveto [lindex [$s get] 0]
}
proc synchScroll {widgets args} {
    foreach w $widgets {$w {*}$args}
}

# Put the GUI together
pack .list1 .scroll .list2 -side left -fill y 

他のスクロール可能なウィジェットをこのスキームにプラグインすることもできることに注意してください。Tk のすべてが同じ方法でスクロールします (スクロールバーの向きの変更を伴う水平スクロール-xscrollcommandを除く)。xviewさらに、ここのコネクタは、wiki ページのコネクタとは異なり、スクロールされたウィジェットの複数のグループで一度に使用できます。一緒にスクロールされる内容の知識は-command、スクロールバーのオプション (コールバックの最初の引数synchScroll) に格納されます。


[編集]: 8.4 以前では、わずかに異なるコネクタ手順が必要です。

# The connectors
proc setScroll {s args} {
    eval [list $s set] $args
    eval [$s cget -command] [list moveto [lindex [$s get] 0]]
}
proc synchScroll {widgets args} {
    foreach w $widgets {eval [list $w] $args}
}

他のすべては同じになります。

于 2012-07-17T08:14:25.290 に答える
0

コールバック コマンドで多くの作業を行う予定がある場合は、それを実行するための手順を作成します。その方が高速であり (手順はバイト コンパイルされます)、tcl 構文の問題が発生する可能性が低くなります。この場合、スクロールバー関数で 2 つの tcl コマンドを実行しようとしているため、改行またはセミコロンを使用してステートメントを区切る必要があります。

両方のリストボックスからスクロールバー セット関数を呼び出すと、2 番目のリスト ボックスが最初のリスト ボックスをオーバーライドします。これら2つをマージする関数が必要か、リストの長さが同じ場合は、それらの1つから呼び出してスクロールバーのサイズと位置を設定し、スクロールバーのコールバックですべてのリストボックスを更新します。

multilistbox パッケージがどこかにあります - Tcl wikiを試して例を見つけてください。

于 2012-07-17T07:05:09.350 に答える