Как сохранить выделение текста видимым в текстовой области, даже если он не сфокусирован в tkinter


person Ghanteyyy    schedule 11.03.2021    source источник
comment
Должен ли это быть выбор, или вы можете просто установить цвет фона текста, чтобы иметь аналогичный визуальный эффект? См., например. здесь прямо внизу страницы.   -  person tobias_k    schedule 11.03.2021
comment
Спасибо за ответ, но я сделал это сам, используя теги.   -  person Ghanteyyy    schedule 11.03.2021
comment
Если вы нашли решение, вы можете рассмотреть возможность самостоятельного ответа на свой вопрос.   -  person tobias_k    schedule 11.03.2021
comment
Да, собираюсь сделать это   -  person Ghanteyyy    schedule 11.03.2021


Ответы (3)


Вы можете установить для параметра exportselection текстового виджета значение False. Это предотвратит автоматическое связывание выделенного текста с буфером обмена. Это та автоматическая ассоциация, которая приводит к удалению выделения при изменении фокуса.

person Bryan Oakley    schedule 11.03.2021
comment
установка exportselection на False не имеет значения, потому что всякий раз, когда я переключаю фокус на другой виджет, выбор исчезает. Я думаю, что всякий раз, когда фокус изменяется, виджет Text автоматически ведет себя так, что выделение исчезает. Итак, я использовал теги, которые решили мою проблему. Я что-то упустил? - person Ghanteyyy; 11.03.2021
comment
@Ghanteyyy: я не знаю. Возможно, ваша платформа определяет другой цвет для несфокусированного выбора. В моей системе текст остается выделенным, хотя он становится серым, когда окно теряет фокус. - person Bryan Oakley; 11.03.2021
comment
Я на Windows. Значит, exportselection ведет себя неправильно? - person Ghanteyyy; 11.03.2021

Я сам понял, что добавление тегов решает проблему.

text_widget.tag_add('highlight', '1.0', '1.24')
text_widget.tag_config('highlight', background='#0078d7')
person Ghanteyyy    schedule 11.03.2021

Установите для exportselection значение False, а для атрибута inactiveselect — тот же цвет, что и для атрибута selectbackground. Пример:

    import tkinter as tk
    
    root = tk.Tk()
    text = tk.Text(root, exportselection = False)
    text.config(inactiveselect = text.cget("selectbackground"))
    text.pack(fill = "both", expand = True)
    root.mainloop()

Пример использования наследования классов:

    import tkinter as tk
    
    class myText(tk.Text):
        def __init__(self, master, **kw):
            tk.Text.__init__(self, master = master, **kw)
            if 'exportselection' not in kw.keys():
                self['exportselection'] = False
            if 'inactiveselect' not in kw.keys():
                self['inactiveselect'] = self['selectbackground']
    
    root = tk.Tk()
    text = myText(root)
    text.pack(fill = "both", expand = True)
    root.mainloop()

Таким образом, виджет «Текст» автоматически установит exportselection в false, а inactiveselect в selectbackground, если вы не зададите какое-либо значение для этого.

person Fernando Hiibner    schedule 23.04.2021