title: Tkinter changing the select background color on an unfocused Text widget
body: <p>I am trying to change the default background color for selected text in a Tkinter Text widget on Mac OS X <em>when the widget does not have focus</em>. The default unfocused select color is gray. After many hours of searching, I was unable to find an out-of-the-box solution to do this. Here is what I have tried:</p>
  
  <ul>
  <li>Changing the select color with the <code>selectbackground</code> option does not change the select color when the widget is not focused. E.g. It stays gray.</li>
  <li>Nor does <code>Text.tag_configure("sel", background=...)</code></li>
  <li>Using <code>ttk.Style.map</code> with the <code>"!focus"</code> state works on Entry widgets (and others), but not Text widgets.</li>
  </ul>
  
  <p>So I had to roll my own (see below). Is there a better way to do this?</p>
  
  <pre class="lang-python prettyprint-override"><code>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("&lt;FocusIn&gt;", focusin)
  text.bind("&lt;FocusOut&gt;", focusout)
  
  
  # Create an Entry widget to easily test the focus behavior
  entry = tk.Entry(root)
  entry.pack()
  
  entry.insert("0", "Focus me!")
  
  root.mainloop()
  </code></pre>