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