【问题标题】:python isdigit() returning unexpected resultpython isdigit() 返回意外结果
【发布时间】:2016-08-04 14:52:39
【问题描述】:

我正在使用 TKinter 为 GUI 制作一个基本的 BMI 计算程序来进行班级分配,但在尝试验证用户的输入时遇到了问题。 我试图只允许数字输入并停用“计算”​​按钮并在用户输入任何非数字时发送错误消息。但是,此时它会为单个数字(例如 2)抛出错误,但会接受多个数字(例如 23)。我对此很陌生,所以请你解释一下为什么会这样,或者是否有更好的方法来写这个?

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

#calculate button
cal = ttk.Button(main, text = 'Calculate!')
cal.grid(row = 4, column = 2)

#height entry box
hb = tk.Entry(main, textvariable = height)
hb.grid(row = 2, column = 2)
hb.bind('<Key>', lambda event: val(hb.get()))

#validation error message
vrs = tk.Label(main, text = 'Please enter a number in the box')
vrs.grid(row = 8, column = 2)
#so that its position is saved but won't appear until validation fails
vrs.grid_remove()

#validation function        
def val(value):
    if value.isdigit():
        print('valid')
        vrs.grid_remove()
        cal.state(['!disabled'])
    else:
        print('invalid')
        vrs.grid()
        cal.state(['disabled'])

提前感谢您的帮助。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您应该做的第一件事是在val 中打印出value,看看您的假设是否正确。验证您的假设始终是调试的第一步。

    您会发现,您的函数在用户输入的数字实际插入到小部件之前被调用。这是预期的行为。

    简单的解决方案是将绑定放在&lt;KeyRelease&gt;,因为插入字符的默认行为是在&lt;KeyPress&gt;

    hb.bind('<Any-KeyRelease>', lambda event: val(hb.get()))
    

    使用Entry 小部件的内置验证功能会更好。示例见https://stackoverflow.com/a/4140988/7432

    【讨论】:

      【解决方案2】:

      你需要在字符串上使用isdigit

      val = '23'
      val.isdigit()  # True
      val = '4'
      val.isdigit()  # True
      val = 'abc'
      val.isdigit()  # False
      

      如果您不确定输入的类型,请先将其转换为字符串,然后再调用isdigit()

      如果您只想要一位数字,则必须检查if int(val) &lt; 10

      【讨论】:

      • 据我所知,输入是一个字符串。只是为了检查我尝试了if str(value).isdigit():,但产生了相同的结果。澄清一下,我不希望只有 1 位数字,但我不希望它们被归类为“无效”
      • OP is 在字符串上调用 isdigit —— 只是不是他们认为的字符串。
      【解决方案3】:

      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
      

      【讨论】:

      • OP 在字符串上调用 isdigit —— 只是不是他们认为的字符串。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多