9

如何从 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)

基本上,我已经改变了我能想到的一切,但文本输入仍然是顽固的白色。

另外,有没有办法改变边框颜色?

4

4 回答 4

27

经过大量的挖掘,我已经弄清楚了。尽管我不得不搜索以弄清楚这一点,但我想其他人会从中受益:

应用于 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'))
于 2013-07-14T13:47:36.707 回答
2

我喜欢您使用图像的方法,但我认为当 PhotoImage 允许动态创建图像时,将图像导入为 base64 编码字符串的过程有点乏味。我已经扩展了这个概念,以创建一个类来处理制作这样一个“图像”以用作边框,并且它接受常规ttk.Entry小部件的任何参数。请注意,我只能在 Windows 10 上进行测试,但这应该与平台无关。

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()
于 2018-08-29T21:38:47.920 回答
2

我找到了更改条目背景颜色的更简单方法。使用:

fieldbackground="你的颜色"

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")
于 2021-04-03T21:56:13.737 回答
1

下面的代码在装有 Python 3.3.2 和 Tcl/Tk 8.5 的 iMac 上运行良好。也适用于带有 Python 3.3.2 和 Tcl/Tk 8.4 的 Mac G5。它不适用于带有 Python 3.3.2 和 Tcl/Tk 8.5 的 Windows XP sp3。在后一种情况下,条目背景,就像它为您所做的那样,仍然是顽固的白色。

这就是它在 Windows 中不改变颜色的原因。该示例也在 Tcl 中。

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

我在您的非工作示例上做了一些工作,它也可以在我的 Mac 上工作,只是我没有从地图中的“活动”和“焦点”得到任何响应。那里什么也没有发生。

其中一些对我来说仍然很神秘。看起来这里有一些帮助:http:
//wiki.tcl.tk/38127
http://wiki.tcl.tk/37973
但它在 Tcl 中,并且假设观众有一些知识只是为了阅读它。

这是我在本文开头提到的示例:

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()
于 2013-07-27T20:13:51.560 回答