文本小部件/列表框同步多滚动? (的Tcl / Tk)

时间:2014-08-24 23:47:39

标签: widget scrollbar tcl tk

您好我正在尝试将一个滚动条绑定到文本小部件和列表框 - 这可能吗?我希望他们同步滚动;基本上,列表框将保存文本小部件的行号;像编辑一样我正在尝试的代码是这样的:

grid [ttk::frame $f] -column 0 -row 0 -sticky nswe;
grid [tk::listbox $f.num -width 4 -background #EBEBEB -foreground #7AA3CC \
-yscrollcommand "set_scroll $s" -relief flat] -column 0 -row 0 -sticky nswe;

grid [tk::text $n -state normal -wrap word -yscrollcommand "set_scroll $s"] -row 0 -column 1 -sticky nswe; 

grid [ttk::scrollbar $s -orient vertical -command {sync_scroll "$f.num $n" yview}] -row 0 -column 2 -sticky nes;

#Sets the scrollbar to the text and listbox widgets 
proc set_scroll {scroll_widget args} {
    eval [list $scroll_widget set] $args;
    eval [$scroll_widget cget -command] [list moveto [lindex [$scroll_widget get] 0]];

return;
}

#Synchronizes their scrolling
proc sync_scroll {widgets args} {
    foreach w $widgets {eval [list $w] args}

    return;
}

我在这里看到了这个解决方案:How to implement tk scrollbar for multiple listboxes (TCL)?

问题是它不适合我。当我单击滚动条并将其拖动到滚动时,它只滚动我的文本小部件;当我的指针位于文本小部件中时,当我使用鼠标滚轮时,它仍然只滚动文本小部件。但是,如果我在指针位于列表框上时使用鼠标滚轮滚动,则两个窗口小部件将按预期同步滚动。这是怎么回事?

1:我的代码中有错误吗?

2:这应该适用于我想尝试的两种不同类型的小部件吗?

3:以上代码,如该链接帖子中所述,适用于Tk 8.4;我正在使用tcl / tk 8.6。关于版本差异,我会有任何问题吗?

4:这是实现我想做的最佳方式吗?我的目标是获得与文本编辑器(如notepad ++或任何IDE)相同的效果;左边有一个部分,跟踪行号。到目前为止这是有效的,但我对这些多卷轴问题没有好处。

1 个答案:

答案 0 :(得分:2)

  1. 第一个明显的问题是,当你更好地使用{sync_scroll "$f.num $n" yview}时,你会:[list sync_scroll [list $f.num $n] yview]。第二个明显的问题是:

    foreach w $widgets {eval [list $w] args}
    

    作为问题的作者,您从(;-)获取代码我可以肯定地说args指的是您想要阅读的变量。 Tcl总是明确表达这种事情;它确实区分了提及使用变量和命令。代码应该是:

    foreach w $widgets {$w {*}$args}
    

    你使用的是8.6,所以你可以使用比eval更少的棘手的习语! (这基本上是我之前答案上半部分的代码。)

  2. 是。只要您向同一方向滚动,它就可以使用两个不同的小部件。我想你可以破解它以水平滚动一个小部件与另一个垂直同步,但你为什么要这样做呢?

  3. Tk 8.6在很多方面非常类似于8.5,而且 与8.4完全不同。 (我当天的提示:你为压缩每一小部分可自定义小部件所付出的努力越少,版本升级就越容易.Tk 真正合理的默认值。)主要区别(8.4-> ; 8.5)您可能会注意到:

    • 更多小部件(ttk命名空间中的小部件)。
    • 文本小部件滚动完全重做。希望你不会有任何问题。

    8.6的主要变化不应该影响你正在做的事情。 (原生PNG支持,在画布上旋转文本,类似的东西。)Tk中从8.5到8.6的脚本可见变化实际上非常小。

  4. 考虑使用ctext中的Tklib小部件。它是一个megawidget - 脚本小部件 - 它为您定义了许多功能。特别是,您可以打开-linemap选项以获取小部件左侧的行号列表(我认为它可能会在默认情况下切换为FWIW)。