为什么 tkinter 认为整数是字符串
Why does tkinter think that integer is string
从昨天开始,我正在实施一个基本的异常处理程序,以使用条件 if
和 elif
语句来处理来自用户的每种类型的错误。一切都很好,直到我的程序错误地认为整数输入是非整数(对于 age
字段),这阻止了我继续我的程序,因为其他函数依赖于此。这是代码片段:
def submit():
username = UserName.get()
firstname = User_FirstName.get()
surname = User_Surname.get()
age = User_Age.get()
height = User_Height.get()
weight = User_Weight.get()
data = [username, firstname, surname, age, height, weight]
flag = False
while flag == False:
if len(username) == 0:
messagebox.showerror('Project Pulse', 'Please ensure the "Username" field is not left blank')
break
elif type(firstname) != str:
messagebox.showerror('Project Pulse', 'Please ensure there are no numbers in the "First Name"')
break
elif len(firstname) == 0:
messagebox.showerror('Project Pulse', 'Please ensure that the "First Name" field is not left blank')
break
elif len(surname) == 0:
messagebox.showerror('Project Pulse', 'Please ensure that the "Last Name" field is not left blank')
break
elif type(surname) != str:
messagebox.showerror('Project Pulse', 'Please ensure there are no numbers in the "Surname"')
break
elif len(age) == 0:
messagebox.showerror('Project Pulse', 'Please ensure the "age" field is not left blank')
break
elif type(age) != int:
messagebox.showerror('Project Pulse', 'Please ensure only integers are input in "Age"')
break
...
else:
flag = True
在这里,提交是一个按钮。 elif
语句继续多行几行,但重点是,程序不会 运行 超过 'age' 行,即错误消息框:'Please ensure only integers are input in "Age"
显示,无论。我试着打印实际的年龄变量,我得到一个整数,所以我似乎找不到问题!
我认为您的问题可能是 get() 将每个用户输入都视为一个字符串。
换句话说,即使用户可能想说 22,计算机也会将其读为“22”。
为了防止这种情况,您可以尝试将 int() 放在 User_Age.get():
周围
int(User_Age.get())
希望对您有所帮助!
-VDizz
与@VDizz 一样,我假设您的值来自 tk.Entry 小部件。因此所有值都将是字符串。因此转换会起作用,但这也会在您的 elif 块中产生错误。为避免导致新问题的错误,您可以尝试编写一个小函数来检查类型。根据此堆栈溢出响应 .
希望这也能有所帮助。
回应@Guilherme Iazzete 的评论(从 link 稍作修改):
def intTryParse(value):
try:
int(value)
return True
except ValueError:
return False
username = 'HarvB'
age = '4'
flag = False
while flag == False:
if len(username) == 0:
messagebox.showerror('Project Pulse', '...')
break
...
elif intTryParse(age) is False:
messagebox.showerror('Project Pulse', '...')
break
...
else:
flag = True
从昨天开始,我正在实施一个基本的异常处理程序,以使用条件 if
和 elif
语句来处理来自用户的每种类型的错误。一切都很好,直到我的程序错误地认为整数输入是非整数(对于 age
字段),这阻止了我继续我的程序,因为其他函数依赖于此。这是代码片段:
def submit():
username = UserName.get()
firstname = User_FirstName.get()
surname = User_Surname.get()
age = User_Age.get()
height = User_Height.get()
weight = User_Weight.get()
data = [username, firstname, surname, age, height, weight]
flag = False
while flag == False:
if len(username) == 0:
messagebox.showerror('Project Pulse', 'Please ensure the "Username" field is not left blank')
break
elif type(firstname) != str:
messagebox.showerror('Project Pulse', 'Please ensure there are no numbers in the "First Name"')
break
elif len(firstname) == 0:
messagebox.showerror('Project Pulse', 'Please ensure that the "First Name" field is not left blank')
break
elif len(surname) == 0:
messagebox.showerror('Project Pulse', 'Please ensure that the "Last Name" field is not left blank')
break
elif type(surname) != str:
messagebox.showerror('Project Pulse', 'Please ensure there are no numbers in the "Surname"')
break
elif len(age) == 0:
messagebox.showerror('Project Pulse', 'Please ensure the "age" field is not left blank')
break
elif type(age) != int:
messagebox.showerror('Project Pulse', 'Please ensure only integers are input in "Age"')
break
...
else:
flag = True
在这里,提交是一个按钮。 elif
语句继续多行几行,但重点是,程序不会 运行 超过 'age' 行,即错误消息框:'Please ensure only integers are input in "Age"
显示,无论。我试着打印实际的年龄变量,我得到一个整数,所以我似乎找不到问题!
我认为您的问题可能是 get() 将每个用户输入都视为一个字符串。
换句话说,即使用户可能想说 22,计算机也会将其读为“22”。
为了防止这种情况,您可以尝试将 int() 放在 User_Age.get():
周围int(User_Age.get())
希望对您有所帮助! -VDizz
与@VDizz 一样,我假设您的值来自 tk.Entry 小部件。因此所有值都将是字符串。因此转换会起作用,但这也会在您的 elif 块中产生错误。为避免导致新问题的错误,您可以尝试编写一个小函数来检查类型。根据此堆栈溢出响应 .
希望这也能有所帮助。
回应@Guilherme Iazzete 的评论(从 link 稍作修改):
def intTryParse(value):
try:
int(value)
return True
except ValueError:
return False
username = 'HarvB'
age = '4'
flag = False
while flag == False:
if len(username) == 0:
messagebox.showerror('Project Pulse', '...')
break
...
elif intTryParse(age) is False:
messagebox.showerror('Project Pulse', '...')
break
...
else:
flag = True