为什么 tkinter 认为整数是字符串

Why does tkinter think that integer is string

从昨天开始,我正在实施一个基本的异常处理程序,以使用条件 ifelif 语句来处理来自用户的每种类型的错误。一切都很好,直到我的程序错误地认为整数输入是非整数(对于 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