0

我正在使用文本小部件

我已经覆盖了右键单击以在我的 Perl/Tk GUI 中显示一个弹出菜单。但是每当我在任何位置右键单击时,从早期光标位置到我右键单击位置的文本都会突出显示。

我不知道是什么原因造成的,所以我只想以编程方式取消选择这个突出显示的文本。

我该怎么做呢?

谢谢!

编辑:

我为右键单击做了一个绑定,这是被调用的子例程:

sub rightClickMenu {
    my ($self, $x, $y) = @_;
    $txt->tagRemove('sel', '1.0', 'end');
    $rightMenu -> post($x, $y);
    $txt->tagRemove('sel', '1.0', 'end');
}

我已经删除了sel标签两次(只是为了确定)。$rightMenu是弹出的菜单。右键单击时显示完美。

4

1 回答 1

1

sel文本小部件中的选择是通过为选定的字符范围设置标签来处理的。可以像这样删除此标签:

.t tag remove sel 1.0 end

假设您的文本小部件的路径名是.t. 这指定对于从第一个 ( 1.0) 到最后一个字符 ( ) 之后的字符位置的所有字符,要删除end该标记。sel

注意:通常在删除标签时,必须处理它已被分配到文本中的多个范围的可能性。上面的标签删除调用从整个文本中清除了标签,这对于选择标签来说很好,因为你(通常)只应该有一个选定的范围。如果有多个具有标签的范围,foo并且您只想清除其中一个,则首先需要找到该范围的开始和结束索引,并tag remove仅在它们之间清除(通过调用)标签。

注2:所有这些都是假设可见效果实际上是由sel标签设置引起的。在 Tk 中,按钮 2 设置此标记不是标准绑定:可能是 Perl-Tk 中的某些非标准绑定设置了一些其他标记,这些标记以与sel标记相同的方式在视觉上显示。为了进一步调查,此命令可能有用:

.t tag names $placeWhereIRightClicked

(再次假设您的文本小部件的路径名是.t,并且它placeWhereIRightClicked包含发生右键单击的位置的索引)将告诉您在该索引处处于活动状态的所有标签。

(命令

.t tag names

将列出整个文本的标签。)

TkDocs 有一篇关于文本小部件的文章,其中tag remove提到了该命令,但没有显示如何在 Perl-Tk 中执行此操作。

文本小部件的 CPAN 文档说该命令的语法是

$text->tagRemove(tagName, index1, ?index2, index1, index2, ...?)

所以我想

$text->tagRemove('sel', '1.0', 'end')

或类似的方法是这样做的(没有 Perl,无法测试)。

(注意:评论中提到的“Hoodiecrow”是我,我之前用过那个昵称。)

于 2014-01-25T18:55:29.753 回答