ttk color de fondo de entrada

¿Cómo cambio exactamente el color de fondo de un widget de entrada de ttk? Lo que tengo hasta ahora es:

self.estyle = ttk.Style() self.estyle.configure("EntryStyle.TEntry", background='black') self.estyle.map("EntryStyle.TEntry", foreground=[('disabled', 'yellow'), ('active', 'blue')], background=[('disabled', 'magenta'), ('active', 'green')], highlightcolor=[('focus', 'green'), ('!focus', 'red')]) self.urlentry_v = StringVar() self.urlentry = ttk.Entry(self.input_frame, style="EntryStyle.TEntry", textvariable=self.urlentry_v) 

Básicamente, he cambiado todo lo que puedo pensar, pero la entrada de texto permanece obstinadamente blanca.

Además, ¿hay alguna forma de cambiar el color del borde?

Lo he descubierto, después de mucho excavar. Tan difícil como tuve que buscar para resolver esto, supongo que otros se beneficiarían de esto:

El estilo estándar aplicado a ttk.Entry simplemente no toma una opción fieldbackground, que sería lo que cambia el color del campo de entrada de texto. La solución es esta para crear un nuevo elemento que responda a la opción.

 from tkinter import * from tkinter import ttk root_window = Tk() estyle = ttk.Style() estyle.element_create("plain.field", "from", "clam") estyle.layout("EntryStyle.TEntry", [('Entry.plain.field', {'children': [( 'Entry.background', {'children': [( 'Entry.padding', {'children': [( 'Entry.textarea', {'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})], 'border':'2', 'sticky': 'nswe'})]) estyle.configure("EntryStyle.TEntry", background="green", foreground="grey", fieldbackground="black") entry_v = StringVar() entry = ttk.Entry(root_window, style="EntryStyle.TEntry", textvariable=entry_v) entry.pack(padx=10, pady=10) 

Desafortunadamente, parece que la única forma de cambiar el color del borde es darle un ancho de borde cero y anidarlo en un marco que actúe como su borde, o definir un nuevo elemento de diseño que use una imagen como borde.

Además, tenga en cuenta que lo único que controla el fondo es el espacio de esquina muy pequeño; si entrecierras los ojos, puedes ver un solo píxel de color verde en cada esquina.

Para usar una imagen como borde, puedes hacer esto:

 img2 = PhotoImage("entryBorder", data=""" R0lGODlhHQAdAOMNAAAAAAQGCAgLERkfLR0mODBFZTFFZTNIajtTezxTez1XgD5XgU Fch////////////ywAAAAAHQAdAAAEbHCQg5i9OGt0iFRaKGLKxBgCoK5s6woGc4Cp a9+AwFQM7ruYn1AVHP6KRhwyaVsyW87nKioFUKXXZ5a5TXaN32FYOD5eqsAzmlX2tZ XqNZGxYATkgAD9wCjUqgIFMgR1I4YZCx4TCYeGCR0DEQA7""") oestyle = ttk.Style() oestyle.element_create("blueborder", "image", "entryBorder", border=3, sticky="nsew") oestyle.layout("OEntryStyle.TEntry", [('Entry.blueborder', {'children': [( 'Entry.padding', {'children': [( 'Entry.textarea', {'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})]) oestyle.configure("OEntryStyle.TEntry", background="black", foreground="grey") oentry_v = StringVar() oentry = ttk.Entry(root_window, style="OEntryStyle.TEntry", textvariable=oentry_v) oentry.pack(padx=10, pady=10) 

La cadena de caracteres se genera al alimentar una imagen de los bordes que quiero como gif para

 import base64 with open('otherframeBorder.gif', 'rb') as f: encoded = base64.encodestring(f.read()) print(encoded.decode('latin1')) 

El código siguiente funciona bien para mí en un iMac con Python 3.3.2 y Tcl / Tk 8.5. También funciona en una Mac G5 con Python 3.3.2 y Tcl / Tk 8.4. NO funciona en Windows XP sp3 con Python 3.3.2 y Tcl / Tk 8.5. En este último caso, el fondo de la entrada, como lo hizo para usted, permanece obstinadamente blanco.

He aquí por qué no cambia los colores en Windows. El ejemplo que hay también en Tcl.

https://groups.google.com/forum/#!topic/comp.lang.tcl/RmbiFrTFCdw

Trabajé un poco en tu ejemplo que no funciona, y también funciona en mi Mac, excepto que no obtengo respuesta de “activo” y “enfocado” en el mapa. Allí no pasa nada.

Algo de esto todavía es muy misterioso para mí. Parece que hay alguna ayuda aquí:
http://wiki.tcl.tk/38127
http://wiki.tcl.tk/37973
pero está en Tcl y asume cierto conocimiento por parte del espectador solo para leerlo.

Aquí está mi ejemplo que mencioné al principio de este post:

 from tkinter import * from tkinter.ttk import * class App(Frame): def __init__(self, parent): super().__init__(parent) s = Style() s.configure('Pink.TEntry', background='hot pink') self.e1 = Entry(self) print("Our entry is of type {}".format(type(self.e1))) b = Button(self, text="Switch Styles", command=self.switch) self.pink = False self.e1.pack() b.pack() def switch(self): if self.pink: print("going white", end="") self.e1["style"] = "TEntry" else: print("going pink", end="") self.e1["style"] = "Pink.TEntry" self.pink = not self.pink print("; style is now {}".format(self.e1["style"])) root = Tk() a = App(root) a.pack() root.mainloop() 

Me gustó su enfoque al usar una imagen, pero creo que es un poco tedioso pasar por el proceso de importar una imagen como una cadena codificada en base64 cuando PhotoImage permite crear imágenes sobre la marcha. He expandido el concepto para hacer una clase que maneje la creación de una ‘imagen’ para usarla como borde, y toma cualquier argumento que un widget ttk.Entry normal haría. Tenga en cuenta que solo puedo probar en Windows 10, pero esto debería ser independiente de la plataforma.

 from tkinter import ttk import tkinter as tk class BorderedEntry(ttk.Entry): def __init__(self, root, *args, bordercolor, borderthickness=1, background='white', foreground='black', **kwargs): super().__init__(root, *args, **kwargs) # Styles must have unique image, element, and style names to create # multiple instances. winfo_id() is good enough e_id = self.winfo_id() img_name = 'entryBorder{}'.format(e_id) element_name = 'bordercolor{}'.format(e_id) style_name = 'bcEntry{}.TEntry'.format(e_id) width = self.winfo_reqwidth() height = self.winfo_reqheight() self.img = tk.PhotoImage(img_name, width=width, height=height) self.img.put(bordercolor, to=(0, 0, width, height)) self.img.put(background, to=(borderthickness, borderthickness, width - borderthickness, height - borderthickness)) style = ttk.Style() style.element_create(element_name, 'image', img_name, sticky='nsew', border=borderthickness) style.layout(style_name, [('Entry.{}'.format(element_name), {'children': [( 'Entry.padding', {'children': [( 'Entry.textarea', {'sticky': 'nsew'})], 'sticky': 'nsew'})], 'sticky': 'nsew'})]) style.configure(style_name, background=background, foreground=foreground) self.config(style=style_name) root = tk.Tk() bentry_red = BorderedEntry(root, bordercolor='red') bentry_blue = BorderedEntry(root, bordercolor='blue') bentry_red.grid(row=0, column=0, pady=(0, 5)) bentry_blue.grid(row=1, column=0) root.mainloop()