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}
}
其他一切都将是一样的。