python - paleta - ttk Color de fondo de entrada
paleta de colores python (2)
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 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 el último caso, el fondo de la entrada, como lo hizo para usted, sigue siendo obstinadamente blanco.
He aquí por qué no cambia los colores en Windows. El ejemplo también está en Tcl.
https://groups.google.com/forum/#!topic/comp.lang.tcl/RmbiFrTFCdw
Trabajé un poco en tu ejemplo no laboral, y también funciona en mi Mac, excepto que no recibo respuesta de "activo" y "foco" en el mapa. Nada sucede allí.
Algo de esto todavía es muy misterioso para mí. Parece que hay algo de 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.
Este es mi ejemplo que mencioné al comienzo de esta publicación:
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()
¿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 sigue siendo obstinadamente blanca.
Además, ¿hay alguna forma de cambiar el color del borde?
Lo he descubierto, después de muchas excavaciones. A pesar de lo duro que 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 cambie el color del campo de entrada de texto. La solución es 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 manera de cambiar el color del borde es darle ancho de borde cero y anidarlo en un marco que actúa como su borde, o definir un nuevo elemento de diseño que utiliza una imagen como un borde.
Además, tenga en cuenta que lo único que controla el fondo es el diminuto espacio de esquina; si entrecierra los ojos, puedes ver un solo píxel verde en cada esquina.
Para usar una imagen como un borde, puede 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 un gif para
import base64
with open(''otherframeBorder.gif'', ''rb'') as f:
encoded = base64.encodestring(f.read())
print(encoded.decode(''latin1''))