1

我尝试了各种选项,但没有成功为两个或多个列表框实现简单的滚动条。以下是我在滚动时出错的代码。我希望你们能帮助我...

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 中的所有内容都以相同的方式滚动(水平滚动-xscrollcommandxview滚动条方向的变化除外)。此外,这里的连接器与 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 回答
1

我知道这篇文章真的很旧,但我最近发现了我认为是一个相当简单的解决方案。我发现我可以使用滑块小部件,而不是使用垂直滚动条。使用滑块,您可以获得滑块的位置并使用它来设置列表框的 yview。可以同时滚动多个列表框。我使用 vtcl 来构建 GUI,因此我可以提供的代码对于那些使用 tk wm 命令的人来说可能并不明显。但这是我使用的代码。它与滑块运动有关。

set listIndex [$widget(Scale1) get]
$widget(Listbox1) yview $listIndex
$widget(Listbox2) yview $listIndex

希望这对某人有帮助。

于 2018-10-10T16:06:01.903 回答
0

如果您打算在回调命令中做很多工作 - 制作一个过程来完成它,因为它既更快(过程得到字节编译)并且不太可能引入 tcl 语法问题。在这种情况下,您尝试在滚动条函数中执行两个 tcl 命令,因此您需要使用换行符或分号分隔语句。

从两个列表框调用滚动条设置函数只会让第二个覆盖第一个。您需要一个函数来合并这两个,或者如果列表具有相同的长度,只需从其中一个调用它来设置滚动条大小和位置,然后使用滚动条回调更新所有列表框。

某处有一个 multilistbox 包 - 尝试Tcl wiki查找示例。

于 2012-07-17T07:05:09.350 回答