如何在 Python Tkinter 中更改条目小部件的边框颜色
How to change a entry widgets border color in Python Tkinter
我正在开发一个具有入口小部件的程序。当用户单击一个按钮并且该条目小部件为空时,程序会将边框颜色更改为红色。但是当我尝试时,边框只是保持相同的颜色。哪个是黑色的。
代码如下:
self.timeField = Entry(self.mfr, width=40, relief=SOLID, highlightbackground="red", highlightcolor="red")
self.timeField.grid(row=0, column=1, sticky=W)
然后在检查它是否为空的 if 语句中将其更改为红色,但它似乎不起作用:
self.timeField.config(highlightbackground="red")
self.timeField.config(highlightcolor="red")
有人可以向我解释为什么这不起作用、我做错了什么以及解决问题的方法吗?提前致谢。
更新:
这是要求的其余代码:
def start(self):
waitTime = self.timeField.get()
password = self.passField.get()
cTime = str(self.tVers.get())
self.cTime = cTime
if waitTime.strip() != "":
if password.strip() != "":
if waitTime.isdigit():
if self.cTime == "Secs":
waitTime = int(waitTime)
elif self.timeVer == "Mins":
waitTime = int(waitTime) * 60
else:
waitTime = int(waitTime) * 3600
self.password = password
root.withdraw()
time.sleep(float(waitTime))
root.deiconify()
root.overrideredirect(True)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
self.tfr.destroy()
self.mfr.destroy()
self.bfr.destroy()
self.create_lockScreen()
else:
self.timeField.configure(highlightcolor="red")
else:
self.passFields.configure(highlightcolor="red")
else:
self.timeField.config(highlightbackground="red", highlightcolor="red")
解决 highlightthickness 问题
您提供的代码应该可以工作,尽管您可能会遇到平台实现问题(即:windows 可能不会像其他平台一样对待高光厚度)
这是一个应该可以运行的程序,尽管我还没有在 windows 7:
上测试过它
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.entry = tk.Entry(self)
self.button = tk.Button(self, text="Validate", command=self.validate)
self.entry.pack(side="top", fill="x")
self.button.pack(side="bottom")
self.validate() # initialize the border
def validate(self):
data = self.entry.get()
if len(data) == 0:
self.entry.configure(highlightbackground="red", highlightcolor="red")
else:
self.entry.configure(highlightbackground="blue", highlightcolor="blue")
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
用边框模拟边框
另一种解决方案是使用比按钮稍大的框架创建边框。这是一个简单的例子。它并没有真正准备好生产,但它说明了这一点:
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.entry = CustomEntry(self)
self.button = tk.Button(self, text="Validate", command=self.validate)
self.entry.pack(side="top", fill="x")
self.button.pack(side="bottom")
self.validate() # initialize the border
def validate(self):
data = self.entry.get()
if len(data) == 0:
self.entry.set_border_color("red")
else:
self.entry.set_border_color("blue")
class CustomEntry(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent)
self.entry = tk.Entry(self, *args, **kwargs)
self.entry.pack(fill="both", expand=2, padx=2, pady=2)
self.get = self.entry.get
self.insert = self.entry.insert
def set_border_color(self, color):
self.configure(background=color)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
虽然这是一个老问题,但我在 windows10 上偶然发现了同样的问题,同时有一个相当简单的解决方案。
除了设置高亮背景和颜色之外,您还必须将高亮厚度更改为更大的零值。
Bryan Oekley 在他的回答的标题中提到了它,但我在他的代码中找不到它,所以这里有一个小代码片段。
self.entry = tk.Entry(self, highlightthickness=2)
self.entry.configure(highlightbackground="red", highlightcolor="red")
(这应该是对 Bryans Answer 的评论)
我正在开发一个具有入口小部件的程序。当用户单击一个按钮并且该条目小部件为空时,程序会将边框颜色更改为红色。但是当我尝试时,边框只是保持相同的颜色。哪个是黑色的。
代码如下:
self.timeField = Entry(self.mfr, width=40, relief=SOLID, highlightbackground="red", highlightcolor="red")
self.timeField.grid(row=0, column=1, sticky=W)
然后在检查它是否为空的 if 语句中将其更改为红色,但它似乎不起作用:
self.timeField.config(highlightbackground="red")
self.timeField.config(highlightcolor="red")
有人可以向我解释为什么这不起作用、我做错了什么以及解决问题的方法吗?提前致谢。
更新: 这是要求的其余代码:
def start(self):
waitTime = self.timeField.get()
password = self.passField.get()
cTime = str(self.tVers.get())
self.cTime = cTime
if waitTime.strip() != "":
if password.strip() != "":
if waitTime.isdigit():
if self.cTime == "Secs":
waitTime = int(waitTime)
elif self.timeVer == "Mins":
waitTime = int(waitTime) * 60
else:
waitTime = int(waitTime) * 3600
self.password = password
root.withdraw()
time.sleep(float(waitTime))
root.deiconify()
root.overrideredirect(True)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
self.tfr.destroy()
self.mfr.destroy()
self.bfr.destroy()
self.create_lockScreen()
else:
self.timeField.configure(highlightcolor="red")
else:
self.passFields.configure(highlightcolor="red")
else:
self.timeField.config(highlightbackground="red", highlightcolor="red")
解决 highlightthickness 问题
您提供的代码应该可以工作,尽管您可能会遇到平台实现问题(即:windows 可能不会像其他平台一样对待高光厚度)
这是一个应该可以运行的程序,尽管我还没有在 windows 7:
上测试过它import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.entry = tk.Entry(self)
self.button = tk.Button(self, text="Validate", command=self.validate)
self.entry.pack(side="top", fill="x")
self.button.pack(side="bottom")
self.validate() # initialize the border
def validate(self):
data = self.entry.get()
if len(data) == 0:
self.entry.configure(highlightbackground="red", highlightcolor="red")
else:
self.entry.configure(highlightbackground="blue", highlightcolor="blue")
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
用边框模拟边框
另一种解决方案是使用比按钮稍大的框架创建边框。这是一个简单的例子。它并没有真正准备好生产,但它说明了这一点:
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.entry = CustomEntry(self)
self.button = tk.Button(self, text="Validate", command=self.validate)
self.entry.pack(side="top", fill="x")
self.button.pack(side="bottom")
self.validate() # initialize the border
def validate(self):
data = self.entry.get()
if len(data) == 0:
self.entry.set_border_color("red")
else:
self.entry.set_border_color("blue")
class CustomEntry(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent)
self.entry = tk.Entry(self, *args, **kwargs)
self.entry.pack(fill="both", expand=2, padx=2, pady=2)
self.get = self.entry.get
self.insert = self.entry.insert
def set_border_color(self, color):
self.configure(background=color)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
虽然这是一个老问题,但我在 windows10 上偶然发现了同样的问题,同时有一个相当简单的解决方案。
除了设置高亮背景和颜色之外,您还必须将高亮厚度更改为更大的零值。 Bryan Oekley 在他的回答的标题中提到了它,但我在他的代码中找不到它,所以这里有一个小代码片段。
self.entry = tk.Entry(self, highlightthickness=2)
self.entry.configure(highlightbackground="red", highlightcolor="red")
(这应该是对 Bryans Answer 的评论)