我正在使用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()
答案 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转换为单字符字符串;如果您执行其中任何一项,则比较将起作用。
但是,有一种更简单的方法可以做到这一点。
首先,为什么甚至首先使用unichr
和48
?如果你只是写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