Tkinter изменяет цвет фона для выбора несфокусированного текстового виджета

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

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

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

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()
9
задан Jason Oster 4 March 2012 в 03:42
поделиться