当我突出显示条目(tkinter)并按退格键时,什么都没发生?

时间:2019-08-28 09:16:17

标签: python python-3.x tkinter tkinter-entry

我正在开发一个有关数学方程式的程序,所以在我的程序中有很多条目,但是清除它们有困难。

对于输入项,我同时限制了字符数限制,并且只允许数字和(“,”)或(“。”)。如果我在输入中输入例如“ 1000”,则将其突出显示并按退格键,一切正常。但是,只要我键入“ 100,25”,然后在混音中添加逗号即可。按退格键后不会删除。

from tkinter import *

root = Tk()

def validatecontent(var):
    return (var.isdigit() == bool(var)) or var == (",")  or var == (".")
vcmd = (root.register(validatecontent), '%S')

def character_limit6(var):
    if len(var.get()) > 0:
        var.set(var.get()[:6])

var = StringVar()
entry = Entry(root, textvariable=var, validate='all', 
         validatecommand=vcmd)
entry.pack()

var.trace("w", lambda *args: character_limit6(var))

root.mainloop()

2 个答案:

答案 0 :(得分:0)

编辑:似乎问题在于它拒绝识别字符串“,”或“。”,或者拒绝识别数字和“,” /“。”字符串。作为合法的。以下似乎有效:

from tkinter import *

root = Tk()

var = StringVar()
var.trace("w", lambda *args: character_limit6(var))

def validatecontent(var):
    return var.isdigit() == bool(var) or "," in var or "." in var


def character_limit6(var):
    if len(var.get()) > 0:
        var.set(var.get()[:6])


vcmd = (root.register(validatecontent), '%S')
entry = Entry(root, textvariable=var, validate='all', 
         validatecommand=vcmd)
entry.pack()


root.mainloop()

答案 1 :(得分:0)

在问题中,当您删除选择时,validatecontent中的var参数是一个字符串,例如。 “ 0,0”使您的验证例程失败。

是否只接受有效的浮点字符串? 您是否希望使用类似“ 1,234.45”或“ 123,45”的字符串?

下面我假设是“ 123,45”

在用'。'替换任何','之后,Validatecontent尝试将字符串转换为浮点型。

如果可以,则返回true,否则仅当字符串为空时才返回True。

from tkinter import *

root = Tk()

def validatecontent(var): # Amended var is now the complete string.
    try:
        temp = var.replace(',', '.')  # Replace ','' with '.' for float conversion assumes , is decimal point.
        # temp = var.replace(',',"")  # Or replace , with empty if , is a thousands delimiter.
        fl = float(temp)
        # if temp converts to a float return length of string is less than 7
        return len(var) < 7
    except ValueError:
        return var == ""   # If it doesn't convert to a float only accept an empty string.

vcmd = (root.register(validatecontent), '%P') # '%P' passes the whole new string to validate content.
entry = Entry(root, validate='key', validatecommand=vcmd) # Validate on key only.
entry.pack()


root.mainloop()

可能存在更好的涉及正则表达式的验证功能。不过,这相当容易遵循。如果需要,该条目仍可以链接到StringVar。虽然不需要进行验证。