如何准确地更改ttk中Entry小部件的背景颜色?到目前为止,我所拥有的是:
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)基本上,我已经改变了我能想到的一切,但文本条目仍然是顽固的白色。
另外,有没有改变边框颜色的方法?
发布于 2013-07-14 21:47:37
经过大量的挖掘,我已经弄明白了。尽管我费了很大力气才弄明白这一点,但我想其他人也会从中受益:
应用于ttk.Entry的标准样式根本不接受fieldbackground选项,该选项将更改文本输入字段的颜色。解决方案是创建一个响应选项的新元素。
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)不幸的是,更改边框颜色的唯一方法似乎是给它零边框宽度并将其嵌套在用作其边框的框架中,或者定义一个使用图像作为边框的新布局项目。
此外,请注意,背景控制的唯一内容是非常小的角落空间;如果您仔细观察,可以在每个角落看到单个像素的绿色。
要使用图像作为边框,可以执行以下操作:
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)字符串是通过提供我想要作为gif的边框图像来生成的。
import base64
with open('otherframeBorder.gif', 'rb') as f:
encoded = base64.encodestring(f.read())
print(encoded.decode('latin1'))发布于 2018-08-30 05:38:48
我喜欢您使用图像的方法,但我认为当PhotoImage允许动态创建图像时,将图像作为base64编码字符串导入的过程有点单调乏味。我对这个概念进行了扩展,创建了一个类,该类处理将此类“图像”用作边框,并且它接受常规ttk.Entry小部件将使用的任何参数。请注意,我只能在Windows10上测试,但这应该是独立于平台的。
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()发布于 2021-04-04 05:56:14
我已经找到了更改条目背景颜色的更简单的方法。使用:
fieldbackgroud="your_color“
entry_style = Style()
entry_style.configure('style.TEntry',
fieldbackground="black",
foreground="white"
)
e = Entry(root, width=80, style='style.TEntry', font='sans 15 bold')
e.focus_force()
e.grid(row=0, column=0, columnspan=4, padx=0, pady=0, sticky="nsew")https://stackoverflow.com/questions/17635905
复制相似问题