2013-07-14 134 views
5

我如何更改ttk的Entry小部件的背景颜色?我到目前为止是:ttk输入背景颜色

 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) 

基本上,我已经改变了我能想到的一切,但文本项仍然固执地白色。

此外,有没有更改边框颜色的方法?

回答

15

我已经想通了,之后很多的挖掘。硬如我不得不寻找摸不着头脑,我想其他人将从中受益:

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

在我的系统中,'fieldbackground'选项与股票'TEntry';无需创建自定义元素。 Python 2.7/Windows和2.7.4/Ubuntu;在这两种情况下,'Tkinter .__ version__ =='$ Revision:81008 $''和'Tkinter.TkVersion =='8。''顺便说一句,感谢'fieldbackground',这是几乎没有记录。 – atzz

+0

如果我不得不猜测,那是因为你在Ubuntu上;据我了解,ttk使用系统的原生样式的部件。所以在Ubuntu中,假设文本输入框需要一个fieldbackground,但不是Windows。 – Firnagzen

+0

它在Windows上也适用于我(正如前面的评论所述)。 *但*这是带有经典主题的Windows XP-32;目前我使用Aero在Win7-64上运行,它不起作用!不幸的是,我现在没有时间进行更多的实验。也许以后。 – atzz

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() 
+0

似乎不起作用。我在Xubuntu 16.04和Python 2.7上使用XFCE。 – rbaleksandar