如何在Python Tkinter中更改输入小部件的边框颜色

3
我正在开发一个程序,其中包含一个输入框部件。当用户点击按钮时,如果该输入框为空,则程序会将其边框颜色更改为红色。但是当我尝试时,边框仍然保持原来的颜色,即黑色。
以下是代码:
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")

也许这个if语句从未被执行过。你的代码有多大?你能把整个代码贴出来吗? - undefined
@Kevin 这个语句正在执行,因为我在配置部分之后加了一个打印语句,它打印出来了。所以问题肯定是其他地方。 - user4429937
你可能错过了我之前评论的后半部分,因为我编辑得比较晚。你的代码有多大?能把整个代码贴出来吗? - undefined
抱歉表述不清。当我说“整个东西”时,我指的是“整个程序”,而不是“整个函数”。我希望能够复制粘贴您的代码并运行它,以查看问题。 - undefined
2个回答

5

虽然这是一个老问题,但我在Windows 10上遇到了同样的问题,现在有一个相当简单的解决方案。

除了设置highlightbackground和color之外,还必须将highlightthickness更改为大于零的值。 Bryan Oakley 在他的答案标题中提到了这一点,但我在他的代码中找不到它,所以这里是一个小代码片段。

self.entry = tk.Entry(self, highlightthickness=2)
self.entry.configure(highlightbackground="red", highlightcolor="red")

(这可能应该是对Bryan答案的评论)

3

解决highlightthickness问题

你提供的代码应该能够工作,但是可能会遇到平台实现问题(例如:Windows可能与其他平台不同处理highlightthickness)。

这里有一个程序应该可以工作,但我没有在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()

我在我的代码中尝试了self.entry.configure(highlightbackground="red", highlightcolor="red"),但它没有起作用。我发布了剩下的代码,以便您可以查看是否有任何问题。 - user4429937
@BurningCode:你完全按照原样运行了吗?你在哪个平台上运行这个程序? - undefined
“焦点高亮”这个词的含义可能会因系统而异。我在Win 7, 3.4上运行。如果我输入一些内容,然后切换到按钮再回到输入框,文本会变成蓝色背景,并且输入任何字符都会擦除蓝色文本并替换为所键入的字符。用鼠标点击重新聚焦不会使文本变蓝,只会添加光标,并追加任何按键。 - undefined
@BryanOakley 有没有其他方法可以让边框看起来变成红色? - user4429937
@BurningCode:是的,你可以在按钮后面放一个框架,使其比按钮稍微宽一点、高一点。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接