我正在使用TKinter为GUI进行类别分配的基本BMI计算程序,并在尝试验证用户输入时遇到问题。 我试图只允许数字输入并停用“计算”#39;按钮并在用户输入不是数字的任何内容时发送错误消息。然而,在一分钟它将为单个数字(例如2)引发错误但将接受多个数字(例如23)。我对此非常陌生,所以请您解释一下为什么会这样,或者是否有更好的方式来写这个?
以下是我的代码的相关部分:
Applicaiton.OpenURL("http://youtube.com/upload");
提前感谢您的帮助。
答案 0 :(得分:0)
首先要调试此问题是在value
内打印val
,看看你的假设是否正确。验证您的假设始终是调试的第一步。
您会发现,在用户输入的数字实际插入窗口小部件之前,您的函数正在被调用。这是预期的行为。
简单的解决方案是将绑定放在<KeyRelease>
上,因为插入字符的默认行为是<KeyPress>
:
hb.bind('<Any-KeyRelease>', lambda event: val(hb.get()))
更好的方法是使用Entry
小部件的内置验证功能。有关示例,请参阅https://stackoverflow.com/a/4140988/7432
答案 1 :(得分:-1)
您需要在字符串上使用IdeOne。
val = '23'
val.isdigit() # True
val = '4'
val.isdigit() # True
val = 'abc'
val.isdigit() # False
如果您不确定输入的类型是什么,请在调用isdigit()
之前先将其强制转换为字符串。
如果您只需要一位数字,则必须检查if int(val) < 10
答案 2 :(得分:-1)
isdigit
是一个字符串方法。你期待一个字符串,一个int或一个浮点数吗?
您可以添加一些这样的类型检查代码,这样无论值是数字类型还是字符串类型,您的程序都会验证。
def val(value):
if type(value) in (int, float):
# this is definitely a numerical value
elif type(value) in (str, unicode, bytes):
# this is definitely a string