如何实现多个列表框(TCL)的tk滚动条?

我尝试了各种select,但没有成功实现两个或多个列表框的简单的滚动条。 以下是我的代码滚动时发生错误。 我希望你们帮助我…

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 "; 

感谢您。

Solutions Collecting From Web of "如何实现多个列表框(TCL)的tk滚动条?"

在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进行水平滚动以及更改滚动条的方向)。 此外,与维基页面上的连接器不同, 此处的连接器可以同时与多组滚动的小部件一起使用; 滚动到一起的知识存储在滚动条的-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} } 

其他一切都是一样的。

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

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

有一个multilistbox包的地方 – 尝试Tcl维基来查找示例。