Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter selected Entry()和Spinbox()字段文本背景和前景(不在焦点位置时)_Python_Tkinter_Ttk - Fatal编程技术网

Python Tkinter selected Entry()和Spinbox()字段文本背景和前景(不在焦点位置时)

Python Tkinter selected Entry()和Spinbox()字段文本背景和前景(不在焦点位置时),python,tkinter,ttk,Python,Tkinter,Ttk,我正在使用tkinerttk小部件,并使用ttk.Style()配置所有内容。 当我使用'clam'主题时,像ttk.Entry()和ttk.Spinbox()这样的小部件有一个默认设置,即当选中文本但小部件不再聚焦时,文本的背景为灰色,前景为白色。这里是一个直观的例子,当光标已经在输入行中,但spinbox中的文本仍然有一些自定义颜色。只有在选择了其他小部件中的文本时,文本的颜色才会返回到未选择的样式 我一直在寻找如何改变这种状况。我发现最接近的是tk.Text()小部件实际上有inacti

我正在使用
tkiner
ttk
小部件,并使用
ttk.Style()
配置所有内容。 当我使用
'clam'
主题时,像
ttk.Entry()
ttk.Spinbox()
这样的小部件有一个默认设置,即当选中文本但小部件不再聚焦时,文本的背景为灰色,前景为白色。这里是一个直观的例子,当光标已经在输入行中,但spinbox中的文本仍然有一些自定义颜色。只有在选择了其他小部件中的文本时,文本的颜色才会返回到未选择的样式

我一直在寻找如何改变这种状况。我发现最接近的是
tk.Text()
小部件实际上有
inactiveselectbackground
的这个选项(没有
inactiveselectforeground
tho)。但是对于
ttk.Entry()
ttk.Spinbox()
来说,这并不是有效的。 另外,当使用常规
tk.Entry()
tk.Spinbox()
或使用ttk小部件的默认主题时,背景和前景不会更改为新颜色。我想选项可能仍然存在,但它们没有设置为任何特定的选项


回到具体问题-有人知道当小部件不再聚焦时,是否可以更改
ttk.Entry()
ttk.Spinbox()
中文本的背景和前景颜色吗?可能是解决此问题的一些方法?

在小部件处于非活动状态(焦点不在)时更改
前台
后台
然后在和绑定的帮助下,我们可以以这样的方式配置小部件:当它们失去焦点和重新获得焦点时,它们将更改其
前景
背景

实际上,我们可以先保存该小部件的原始
前台
后台
值,然后使用它和回调

在这里,我做了一个类条目,这正是您想要的。我添加了
inactivebackground
inactiveforeground
配置选项

类条目(tk.Entry):
def _初始功率(自,主=无,**kw):
self.inactivebackground=kw.pop('inactivebackground','white')
self.inactiveforeground=kw.pop('inactiveforeground','black')
超级()
self.org_bg=self['background']
self.org_fg=self['front']
self.bind(“”,self._focusin,“+”)
self.bind(“”,self._focusout,“+”)
self.\u focusout()
def_聚焦输出(自身,evt=None):
self['background']=self.inactivebackground
self['foreground']=self.inactiveforeground
def_聚焦(自身,evt=None):
self['background']=self.org\u bg
self['foreground']=self.org\u fg
看看这个例子:-

将tkinter作为tk导入
root=tk.tk()
var=tk.StringVar(value=“你好!你好吗!:))
条目(根,textvariable=var,inactivebackground='pink',
inactiveforeground='blue').pack()
条目(根,textvariable=var,inactivebackground='orange',
inactiveforeground='red').pack()
root.mainloop()
类似地,您可以修改
Spinbox
来执行相同的操作。另外,只需将继承的类
tk.Entry
替换为
ttk.Entry
也可用于
ttk
样式的小部件,但请记住,并不是所有内容都可以通过
ttk
样式的小部件直接配置


继承权 有一个技巧可以节省时间和空间,即创建一个支持类,该类可以与所需的小部件一起继承,以具有相同的功能

class supportinactive(对象):
def u u init u uuu(自身、非活动背景、非活动前景):
self.inactivebackground=不活动背景
self.inactive前台=inactive前台
self.org_bg=self['background']
self.org_fg=self['front']
self.bind(“”,self._focusin,“+”)
self.bind(“”,self._focusout,“+”)
self.\u focusout()
def_聚焦输出(自身,evt=None):
self['background']=self.inactivebackground
self['foreground']=self.inactiveforeground
def_聚焦(自身,evt=None):
self['background']=self.org\u bg
self['foreground']=self.org\u fg
如何使用它? 从上面的
supportinactive
类中,我们可以像这样将此功能添加到小部件中

类条目(tk.Entry,supportinactive):
def _初始功率(自,主=无,**kw):
inactivebg=kw.pop('inactivebackground','white')
inactivefg=kw.pop('inactiveforeground','black')
tk.条目.uuuu初始(自,主=主,**kw)
supportinactive.\uuuuu init\uuuuuuuuu(自我、非活动BG、非活动FG)
#Spinbox也将具有相同的功能。
类Spinbox(tk.Spinbox,supportinactive):
def _初始功率(自,主=无,**kw):
inactivebg=kw.pop('inactivebackground','white')
inactivefg=kw.pop('inactiveforeground','black')
tk.Spinbox.\uuuuuuuuuuuuuuuuuuuuuuuuuu初始(自,主=主,**kw)
supportinactive.\uuuuu init\uuuuuuuuu(自我、非活动BG、非活动FG)
如果您想了解此继承是如何工作的,请查看以下答案:-


我发布的是一个答案,因此我可以添加图片,并明确说明未更改的配置。 上面的答案是更改这些配置的一种非常好的方法,但只有在使用
tk.Entry()
小部件时才有效。我正在使用
ttk.Entry()
'clam'
主题。而
“clam”
主题就是在选中文本且小部件失去焦点时为背景/前景引入此附加配置的主题。 以上给出的答案修改的是:

  • 背景/前景
    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    root.geometry('200x100')
    
    style = ttk.Style()
    style.theme_use('clam')
    style.configure('New.TEntry',
                    fieldbackground='red',
                    foreground='green',
                    selectbackground='black',
                    selectforeground='yellow')
    
    class NewEntry(ttk.Entry):
        def __init__(self, parent, style):
            super().__init__(parent)
            self.style = style
            self['style'] = 'New.TEntry'
    
            self.bind('<FocusIn>', self._focusin, '+')
            self.bind('<FocusOut>', self._focusout, '+')
    
        def _focusout(self, evt=None):
            self.style.configure('New.TEntry',
                                 fieldbackground='red',
                                 foreground='green',
                                 selectbackground='black',
                                 selectforeground='yellow')
    
        def _focusin(self, evt=None):
            self.style.configure('New.TEntry',
                                 fieldbackground='blue',
                                 foreground='pink',
                                 selectbackground='black',
                                 selectforeground='yellow')
    
    
    entry1 = NewEntry(root, style).pack()
    entry2 = tk.Entry(root).pack()
    
    root.mainloop()