【问题标题】:Can't check ASCII values of user-inputted characters in Tkinter无法在 Tkinter 中检查用户输入字符的 ASCII 值
【发布时间】:2013-11-28 22:09:37
【问题描述】:

我正在使用 Python 2 和 Tkinter 创建一个图形程序。该程序允许用户输入一些东西,然后单击一个按钮来检查输入是否是全数字的。我正在尝试使用一个检查输入中每个字符的 ASCII 值的函数来执行此操作。但是,它似乎无法在 Tkinter 中正确处理用户输入,即使输入存储为字符串。输入框上方的标签将发生变化,以反映输入是否被识别为全数字。即使输入完全是数字,标签仍会更改为“输入不仅仅是数字”。

这是我的代码:

#coding: iso-8859-1
from Tkinter import*
root = Tk()

def input_numeric(inpput):
    if len(inpput) == 0:
        return False
    else:
        for i in range(0, len(inpput)):
            if inpput[i] < 48 or inpput[i] > 57:
                return False
        return True

def something():
    if input_numeric(inpput.get()) == False:
        labbel.configure(text = "Input is not numeric only.")
    else:
        labbel.configure(text = "Input is fully numeric!")

labbel = Label(root, text = "Type something: ")
labbel.pack()

inpput = StringVar()
typing_box = Entry(root, textvariable = inpput)
typing_box.pack(fill = BOTH)

click_button = Button(text = "Click this button", command = something)
click_button.pack()

root.mainloop()

【问题讨论】:

  • Python 1-length 字符串不是 C chars.
  • 尝试将 print ord(inpput[i]) 插入你的 for 循环,看看你得到了什么字符
  • 非常感谢!我忘记了在 Python 中你必须使用 ord 函数来获取 ASCII 值。现在它完美地工作了! :)
  • “数字”到底是什么意思? -12 算不算? 1.2?像۱۲ 这样的波斯数字呢?或者像½这样的东西?如果您的意思是“可以被 Python 解释为 int”,那么最简单的检查方法是 try 将其解释为 int。如果您的意思是“完全由 Unicode 类型为 Nd 的字符组成”,那就是 isdigit。如果您的意思是“完全由 ASCII 数字字符组成,那就是“字符串中的 ch.digits ”。以此类推。
  • 我的意思是输入只包含数字。

标签: python encoding tkinter character ascii


【解决方案1】:

看起来你的问题已经解决了,但我想建议一个更好的方法:使用str.isdigit

#coding: iso-8859-1
from Tkinter import *
root = Tk()

def something():
    if inpput.get().isdigit():
        labbel.configure(text = "Input is fully numeric!")
    else:
        labbel.configure(text = "Input is not numeric only.")

labbel = Label(root, text = "Type something: ")
labbel.pack()

inpput = StringVar()
typing_box = Entry(root, textvariable = inpput)
typing_box.pack(fill = BOTH)

click_button = Button(text = "Click this button", command = something)
click_button.pack()

root.mainloop()

这是因为Tkinter.StringVar.get 返回一个字符串对象。

【讨论】:

    【解决方案2】:

    您的代码无法正常工作的原因是您将单字符字符串与数字进行比较。在 Python 2.x 中,所有数字都小于所有字符串。 (比较不同类型的值的确切规则有点复杂,但在这里不必担心。)在 Python 3.x 中,将数字与字符串进行比较只会引发异常。

    要确定单字符字符串的 ASCII 值是否小于 48,您需要使用 ord 将字符串转换为其 8 位或 Unicode 代码点,或者使用 chr 或 @987654323 @ 将 48 转换为一个字符的字符串;如果您执行其中任何一项,则比较将起作用。

    但是,有一种更简单的方法可以做到这一点。

    首先,为什么还要使用4857?如果你只写inpput[i] &lt; '0' or inpput[i] &gt; '9' 它会起作用,并且更具可读性。 (顺便说一句,这在 C 中和在 Python 中一样有效。)或者,更简单的是,使用链式比较,例如 '0' &lt;= inpput[i] &lt;= '9'

    但如果你真的想检查每个字符是否都是 ASCII 数字,Python 有一个更简单的方法。你可以检查inpput[i] in string.digits是否。

    或者,更简单的是,您可以使用inpput.isdigit() 一次检查整个字符串。但这有不同的作用。它使用默认字符集(如果是str)或Unicode(如果是unicode)的适当定义来检查每个字符是否是数字。例如,u'۱۲'.isdigit() 为 True,因为这两个字符都是数字。 (它们是12 的波斯数字。)还有一些字符是“数字”,但不是“数字”,例如½isdigit 将为那些返回 False。

    这就提出了一个更大的问题:您究竟想在这里测试什么?你想要“只是ASCII数字”吗?还是“只是数字”?还是“Python 可以将其解释为int”? “数字”有很多可能的含义,并且有一种简单的方法可以测试它们中的每一个;重要的是决定哪一个是你想要的。

    例如,如果您的规则是“Python 可以解释为非负的 int”,那么显而易见的规则是调用 int,然后检查它是否为非负:

    def input_numeric(inpput):
        try:
            i = int(inpput)
            return i >= 0
        except ValueError:
            return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2021-12-13
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多