2014-01-25 3 views
0

Я использую Текстовый виджет.Снять выделение со страницы программно

Я перевернул правый щелчок, чтобы отобразить всплывающее меню в моем графическом интерфейсе Perl/Tk. Но всякий раз, когда я нажимаю правой кнопкой мыши в любой позиции, выделяется текст из более раннего местоположения курсора до места, где я щелкнул правой кнопкой мыши.

Я не знаю, что вызывает это, поэтому я просто хочу программно отменить выделенный выделенный текст.

Как мне это сделать?

Спасибо!

EDIT:

Я сделал привязку к правой кнопкой мыши, и это подпрограмма, которая называется:

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

Я удалил Сель тег дважды (просто чтобы быть конечно). $rightMenu - это меню, которое появилось. При щелчке правой кнопкой мыши он отлично выглядит.

+0

Вы должны показать код, как отключить всплывающее меню. Пожалуйста, сделайте код как можно короче, разделив несвязанные вещи. –

+0

Добавьте к этому код, который вы используете для удаления тега '' sel'', и код, который активирует удаление тега. Опять же, как можно меньше кода. –

+0

@Hoodiecrow Я добавил код. Я серьезно надеюсь, что совершил ошибку. –

ответ

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 есть статья about the text widget, где указана команда tag remove, но как это сделать в Perl-Tk не отображается.

документация CPAN для текстового виджета говорит, что синтаксис для команды является

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

поэтому я полагаю

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

или что-то подобное, что есть способ сделать это (без Perl, не может проверить).

(Примечание: «Hoodiecrow» упоминается в комментариях, я, я использовал это ник раньше.)

+0

Я попробовал. Он не работает! –

+0

Извините, я не думаю, что смогу вам помочь. Вероятно, это проблема Perl-Tk, поскольку она отлично работает с Tcl/Tk. (Вы _did_ замените свою собственную виджет-удерживающую переменную для '$ text' и т. Д., Правильно?) –

+0

Oh! Кажется, что индексы, даже квази-числовые, должны быть строками. Попробуйте вместо этого указать «1.0». –