【问题标题】:ttk Entry background colourttk 条目背景颜色
【发布时间】:2013-07-12 05:38:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: python tkinter ttk


    【解决方案1】:

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

    应用于 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'))
    

    【讨论】:

    • 在我的系统上,fieldbackground 选项适用于股票TEntry;无需创建自定义元素。 Python 2.7/Windows 和 2.7.4/Ubuntu;在这两种情况下,Tkinter.__version__ == '$Revision: 81008 $'Tkinter.TkVersion == '8.5' BTW,感谢fieldbackground,几乎没有任何记录。
    • 如果我不得不猜测,那是因为您使用的是 Ubuntu;据我了解, ttk 为小部件使用系统的本机样式。因此,在 Ubuntu 中,大概文本输入框采用字段背景,而不是 Windows。
    • 它在 Windows 上也适用于我(如前面的评论中所述)。 但是 那是带有经典主题的 Windows XP-32;目前我在使用 Aero 的 Win7-64 并且它不起作用!不幸的是,我现在没有时间进行更多实验。也许以后。
    • 我知道这已经很老了,但你让我免于真正的头痛。我想做的只是改变我的ttk.Entry 的背景,但没有任何效果。我不知道fieldbackground。非常感谢!
    • 为什么更改 Entry 小部件的背景颜色如此困难?这里出了什么问题?无论如何,感谢您的帮助。
    【解决方案2】:

    下面的代码在装有 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()
    

    【讨论】:

    • 似乎不起作用。我在 Xubuntu 16.04 和 Python 2.7 上使用 XFCE。
    【解决方案3】:

    我喜欢您使用图像的方法,但我认为当 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()
    

    【讨论】:

      【解决方案4】:

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

      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")
      

      【讨论】:

      • 在 Ubuntu Mate 20.04 上为我工作。谢谢4分享!!
      • 在 RH 6.5 上使用 python 3.7.2
      猜你喜欢
      • 2023-02-23
      • 2014-07-03
      • 1970-01-01
      • 2016-06-09
      • 2011-04-30
      • 2014-07-08
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多