如何通过变量设置文本索引
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
,这将起作用。
理解它的一种方法是将调用视为由命令名称和参数组成的列表,并且 {*}
是将以下参数的值拼接到该列表中的指令在列表中的那个位置。
文档:{*}
我正在尝试在我的 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
,这将起作用。
理解它的一种方法是将调用视为由命令名称和参数组成的列表,并且 {*}
是将以下参数的值拼接到该列表中的指令在列表中的那个位置。
文档:{*}