2012-07-17 166 views
1

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

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

谢谢你。

回答

0

the Tcler's 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} 
} 

一切将是相同的。

+0

谢谢......我认为这适用于tcltk 8.5而我正在8.4(仍然)工作,所以不适合我。但我试图用你的基础开始。 – OliveOne 2012-07-17 14:18:47

0

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

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

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

+0

感谢“patthoyts”......我希望详细了解这一点,而不仅仅是完成它。 – OliveOne 2012-07-17 13:56:21