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

时间:2015-06-24 10:01:38

标签: tcl tk

我正在尝试在我的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一起使用)。

任何提示如何为已标记的文本添加标记?

1 个答案:

答案 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是将以下参数的值拼接到该列表中的指令点在列表中。

文档:{*}