python isdigit()返回意外结果

时间:2016-08-04 14:52:39

标签: python tkinter

我正在使用TKinter为GUI进行类别分配的基本BMI计算程序,并在尝试验证用户输入时遇到问题。 我试图只允许数字输入并停用“计算”​​#39;按钮并在用户输入不是数字的任何内容时发送错误消息。然而,在一分钟它将为单个数字(例如2)引发错误但将接受多个数字(例如23)。我对此非常陌生,所以请您解释一下为什么会这样,或者是否有更好的方式来写这个?

以下是我的代码的相关部分:

Applicaiton.OpenURL("http://youtube.com/upload");

提前感谢您的帮助。

3 个答案:

答案 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