当我突出显示我的条目(tkinter)并按backspace时,什么都没有发生?

2024-10-04 11:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个关于数学方程的程序,所以在我的程序中有很多条目,但是我很难清除它们。你知道吗

对于条目,我限制字符限制,并且只允许数字和(“,”)或(“.”)。如果我在我的条目中键入例如“1000”,然后突出显示它并按backspace键,一切都会解决。但只要我键入“100,25”并在混合中加上逗号。按backspace后不会删除。你知道吗

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

Tags: or程序get键入vardef条目数学
2条回答

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

是否只接受有效的浮点字符串? 您需要像“1234.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。不过,不需要进行验证。你知道吗

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

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

相关问题 更多 >