如何通过变量设置文本索引

how to set text indices via a variable

我正在尝试在我的 tcl/tk text 小部件中实现一个简单的行突出显示机制。

为此,我想将所有标有一个标签的字符分配给另一个标签。

.window.text insert end "one line\n" line1
.window.text insert end "a chunk spanning\nmultiple lines" line2
.window.text insert end "thats all\n" line3

# get all text that is tagged as 'line2'
set selected [ .window.text tag ranges line2 ]

# and apply the 'highlighed' tag to it:
.window.text tag add highlighted $selected

不幸的是,这不起作用,因为它给了我

bad text index "2.0 4.0"

按字面意义使用索引可以正常工作:

.window.text tag add highlighted 2.0 4.0

但这不是我想要的。 (除了他们的标签,我对标记的块一无所知)

所以我似乎无法将索引列表存储在变量中并将其与 tag add(或 tag remove 一起使用)。

有什么提示可以向已加标签的文本添加标签吗?

解决方案(在 Tcl 8.5 及更高版本中):

.window.text tag add highlighted {*}$selected

如果命令 A 为您提供了要提供给命令 B 的项目列表,但命令 B 希望每个项目在其调用中作为参数出现,则需要拼接项目列表,或者 扩展 为单独的参数。在 Tcl 8.5 中,通过引入新的句法规则促进了这一点,该规则允许通过扩展现有参数之一来增加提供给命令的参数数量。

举个例子,<b>destroy</b> ?<i>window</i> <i>window</i> <i>...</i>? 命令无法处理 winfo children . 返回的 windows 列表,因为每个 window 路径需要是一个单独的参数。写作

destroy [winfo children .]

将被评估为(比如)destroy {.foo .bar .baz},这是行不通的。但是,使用新的扩展前缀 {*}

destroy {*}[winfo children .]

该行将被评估为 destroy .foo .bar .baz,这将起作用。

理解它的一种方法是将调用视为由命令名称和参数组成的列表,并且 {*} 是将以下参数的值拼接到该列表中的指令在列表中的那个位置。

文档:{*}