Tkinter меняет выбранный цвет фона на не сфокусированный текстовый виджет - PullRequest
8 голосов
/ 04 марта 2012

Я пытаюсь изменить цвет фона по умолчанию для выделенного текста в виджете Tkinter Text в Mac OS X , когда виджет не имеет фокуса .По умолчанию не сфокусированный цвет выбора - серый.После многих часов поиска я не смог найти готового решения для этого.Вот что я пробовал:

  • Изменение выбранного цвета с помощью опции selectbackground не меняет выбранный цвет, когда виджет не сфокусирован.Например, он остается серым.
  • Также не Text.tag_configure("sel", background=...)
  • Использование ttk.Style.map с состоянием "!focus" работает на виджетах ввода (и других), но не на виджетах текста.1015 *

    Так что мне пришлось катиться самостоятельно (см. Ниже).Есть ли лучший способ сделать это?

    import Tkinter as tk
    
    # Replace 'tag_out' with 'tag_in'
    def replace_tag(widget, tag_out, tag_in):
        ranges = widget.tag_ranges(tag_out)
        widget.tag_remove(tag_out, ranges[0], ranges[1])
        widget.tag_add(tag_in, ranges[0], ranges[1])
    
    def focusin(e):
        replace_tag(e.widget, "sel_focusout", "sel")
    
    def focusout(e):
        replace_tag(e.widget, "sel", "sel_focusout")
    
    
    root = tk.Tk()
    
    # Create a Text widget with a red selected text background
    text = tk.Text(root, selectbackground="red")
    text.pack()
    
    # Add some text, and select it
    text.insert("1.0", "Hello, world!")
    text.tag_add("sel", "1.0", "end")
    
    # Create a new tag to handle changing the background color on selected text
    # when the Text widget loses focus
    text.tag_configure("sel_focusout", background="green")
    replace_tag(text, "sel", "sel_focusout")
    
    # Bind the events to make this magic happen
    text.bind("<FocusIn>", focusin)
    text.bind("<FocusOut>", focusout)
    
    
    # Create an Entry widget to easily test the focus behavior
    entry = tk.Entry(root)
    entry.pack()
    
    entry.insert("0", "Focus me!")
    
    root.mainloop()
    

1 Ответ

11 голосов
/ 05 марта 2012

Копание исходного кода Tk привело меня к ответу! Опция inactiveselectbackground устанавливает цвет.

import Tkinter as tk

root = tk.Tk()

# Create a Text widget with a red selected text background
# And green selected text background when not focused
text = tk.Text(root, selectbackground="red", inactiveselectbackground="green")
text.pack()

# Add some text, and select it
text.insert("1.0", "Hello, world!")
text.tag_add("sel", "1.0", "end")

# Create an Entry widget to easily test the focus behavior
entry = tk.Entry(root)
entry.pack()

entry.insert("0", "Focus me!")

root.mainloop()
...