Как изменить текущую длину выделения в виджете Tkinter Text? - PullRequest
1 голос
/ 31 марта 2012

Я бы хотел иметь возможность дважды щелкнуть по test,
в виджете Tkinter Text, и он должен выбрать тест (и исключить запятую).

Вот что я пробовал:

import Tkinter as tk

def selection_mod(event=None):
    result = aText.selection_get().find(',')
    if result > 0:
        try:
            aText.tag_add("sel", "sel.first", "sel.last-1c")
        except tk.TclError:
            pass

lord = tk.Tk()

aText = tk.Text(lord, font=("Georgia", "12"))
aText.grid()

aText.bind("<Double-Button-1>", selection_mod)

lord.mainloop()

Первая проблема заключается в том, что <Double-Button-1>, кажется, вызывает обработчик до того, как выбор сделан, производя:

TclError: ПЕРВИЧНЫЙ выбор не существует или формируется«STRING» не определено

Вторая проблема заключается в том, что даже при использовании работающей привязки
мой тег выбора, похоже, ничего не делает.
Он даже не вызываетошибка, и я попытался без except tk.TclError:.

Ответы [ 2 ]

1 голос
/ 08 августа 2012

Вот что я придумал благодаря ответу Брайана:

import Tkinter as tki # tkinter in Python 3

def selection_mod(event=None):
    result = txt.selection_get().find(',')
    if result > 0:
       fir, sec = txt.tag_ranges("sel")
       txt.tag_remove("sel", "sel.first", "sel.last")
       txt.tag_add("sel", fir, str(sec)+"-1c")

root = tki.Tk()

txt = tki.Text(root, font=("Georgia", "12"))
txt.grid()

txt.bind("<Double-Button-1>", lambda x: root.after(20, selection_mod))

root.mainloop()

Стоит отметить, что я использую Windows 7, и, по словам Брайана,
OSX не включает запятую при двойном щелчке по слову.

1 голос
/ 01 апреля 2012

Ваша привязка происходит до привязки по умолчанию.Таким образом, выбор еще не существует, когда ваша привязка срабатывает.Поскольку ваша привязка пытается получить выбор, она завершается с ошибкой, которую вы видите.

Вам нужно будет организовать привязку, чтобы она произошла после привязок класса.Дешевый взлом состоит в том, чтобы использовать after для выполнения вашего кода, когда у привязок по умолчанию есть шанс сработать.Или вы можете использовать функцию bindtag, чтобы убедиться, что привязка срабатывает после привязок по умолчанию.

Вторая проблема заключается в том, что вы не очищаете старый выбор перед установкой нового.Вы хотите сделать tag_remove, чтобы сначала удалить существующий выбор.В противном случае запятая (если она была каким-то образом выбрана) останется выделенной, поскольку все, что вы делаете, - это повторно применяете тег к тексту, который уже имеет тег.

Однако двойной щелчок обычно не фиксирует запятую, поэтому я не совсем понимаю смысл вашего кода.По крайней мере, когда я тестирую его на OSX, он не включает запятую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...