我正在尝试在我的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
不幸的是,这不行,因为它给了我
坏文字索引“2.0 4.0”
使用索引字面上工作正常:
.window.text tag add highlighted 2.0 4.0
但不是我想要的。 (除了标签之外,我对标记的块没有任何了解)
因此,我似乎无法将索引列表存储在变量中,并将其与tag add
(或tag remove
一起使用)。
任何提示如何为已标记的文本添加标记?
答案 0 :(得分:3)
解决方案(在Tcl 8.5及更高版本中):
Scanner.nextInt
如果命令A已经为您提供了要提供给命令B的项目列表,但命令B希望每个项目在其调用中显示为参数,则需要拼接项目列表,或展开成为单独的参数。在Tcl 8.5中,通过引入一种新的语法规则来促进这一点,该规则允许通过扩展现有参数之一来增加提供给命令的参数数量。
借用一个例子,.window.text tag add highlighted {*}$selected
命令不能与destroy ?window window ...?
返回的窗口列表一起使用,因为每个窗口路径都需要是一个单独的参数。写
winfo children .
将被评估为(例如)destroy [winfo children .]
,这不会起作用。但是,使用新的扩展前缀destroy {.foo .bar .baz}
{*}
该行将被评估为destroy {*}[winfo children .]
,这将起作用。
理解它的一种方法是将调用视为由命令名和参数组成的列表,并且destroy .foo .bar .baz
是将以下参数的值拼接到该列表中的指令点在列表中。
文档:{*}