Tkinter 输入验证:检查有效颜色或颜色部分

0 投票
2 回答
1115 浏览
提问于 2025-04-18 06:53

最近,我发现Entry小部件的验证选项非常有用(可以参考这个问题)。我尝试写一个验证命令,用来检查用户输入的是十六进制颜色代码,还是一个命名颜色。我写的这个代码对十六进制颜色代码效果很好,但对命名颜色的验证偶尔会失效。这个验证会在每次按键时运行,其他一些情况也是如此。(validate=ALL

def checkColorValid(P):
    global backgroundColor
    if not P:
        return True

    if P.lower() in colors:
        backgroundColor = P
        return True

    if P[0] == '#':
        try:
            if len(P) == 1:
                return True
            int(P[1:], 16)
            if len(P) < 8:
                backgroundColor = P
                return True
            else:
                return False
        except ValueError:
            return False

    for color in colors:
        if color.startswith(P.lower()):
            return True

colors 是一个包含所有有效命名颜色的列表。
这个验证代码是有效的,除非你在输入一个命名颜色时,不停地重复输入同一个字符。一旦发生这种情况,验证似乎就停止工作了。它完全不再运行,直到你重启程序。

2 个回答

0

我也遇到过同样的问题,在搜索时找到了这个页面。虽然不太喜欢这个方法,但又想不出更好的办法。后来我意识到自己想得太复杂了。Python有一个很好的方法来测试任何东西是否有效,那就是用'try'。这个'try'不需要很复杂,只要用一个简单的对象来测试你想要的颜色就可以了。

def ColorTest(SomeColor):
    IsGood = True
    ColorTest=Toplevel()
    try:
        ColorTest['bg'] = SomeColor # Set backround color
        #print(SomeColor+' is a valid color')
        ColorTest.destroy()
        return IsGood
        
    except:
        #print(SomeColor+' is an invalid color')
        IsGood = False
        ColorTest.destroy()
        return IsGood
2

验证代码有可能返回 None,而不是 TrueFalse。也许加一个最后的返回语句会有所帮助。

撰写回答