无法在Tkinter中检查用户输入字符的ASCII值

时间:2013-11-28 22:09:38

标签: python encoding tkinter character ascii

我正在使用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()

2 个答案:

答案 0 :(得分:0)

看起来您的问题已经解决,但我想建议一个更好的方法:使用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返回一个字符串对象。

答案 1 :(得分:0)

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

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

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

首先,为什么甚至首先使用unichr48?如果你只是写57它会起作用,并且更具可读性。 (顺便说一下,这在C和Python中的效果一样。)或者更简单地说,使用链式比较,比如inpput[i] < '0' or inpput[i] > '9'

但是如果你真的想检查每个字符是否都是ASCII数字,那么Python就有了更简单的方法。您可以查看是否'0' <= inpput[i] <= '9'

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

这提出了一个更大的问题:你究竟想在这里测试什么?你想要“只是ASCII数字”吗?还是“只是数字”?或者“Python可以解释为isdigit”? “数字”可能意味着许多可能的东西,并且有一种简单的方法来测试它们中的每一个;重要的是决定哪一个是你想要的那个。

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

int