Rh4751 2023-11-13 23:00 采纳率: 70%
浏览 7
已结题

为什么这段代码输入非数值时无弹窗提示错误?



import tkinter as tk 
from tkinter import messagebox
 
# 创建一个主窗口
root = tk.Tk()
root.withdraw()  # 隐藏主窗口

def validate_age(age):    
    try:    
        age = int(age)    
        if age < 0 or not isinstance(age, int):    
            messagebox.showerror("输入错误", "请输入有效的年龄(正整数)。")    
            return False    
        else:    
            return True    
    except ValueError:    
        messagebox.showerror("输入错误", "请输入有效的年龄(正整数)。")    
        return False  
                    
def validate_measurements(height, weight):  
    if not isinstance(height, (int, float)) or height <= 0:    
        return False   
    if not isinstance(weight, (int, float)) or weight <= 0:    
        return False   
    return True  
    
 
def check_parameters(age,height,weight): 
    try: 
        if not validate_age(age):  
            messagebox.showerror("输入错误", "请输入正整数作为年龄。")  
            return False  
    
        if not validate_measurements(height,weight):  
            messagebox.showerror("输入错误", "请输入正数作为所有的测量值。")  
            return False  
        return True  
    except ValueError as e:  # 捕获异常并显示错误消息弹窗  
        messagebox.showerror("输入错误", str(e))  # 显示相应的错误消息弹窗
        print(e)  
        return False  # 返回 False 表示参数验证未通过,阻止程序的继续执行
    
def main():
    name=input('姓名')
    age = int(input('年龄') ) 
    height = float(input('身高'))   
    weight = float(input('体重'))  
 
 
    try: 
        if not check_parameters(age,height,weight):
            print("参数校验未通过,终止计算!")
            return None
        print("参数校验通过!")  
    except ValueError as e:
        print("参数校验未通过:", e)
        return None 
    
    print(age)
    print(height)
    print(weight)
    
main()
 
  • 写回答

2条回答 默认 最新

  • 虫鸣@蝶舞 2023-11-13 23:37
    关注

    在您提供的代码中,主要的逻辑问题是在 main() 函数中直接使用 int(input())float(input()) 转换输入值。当输入非数值字符串时,这些转换会引发 ValueError,导致程序直接跳转到 except 块而不是调用 check_parameters 函数,从而无法弹出 tkinter 的错误消息。

    要解决这个问题,您需要先读取输入作为字符串,然后在 check_parameters 函数内部对这些字符串进行转换和验证。这样,如果转换失败或者验证不通过,tkinter 的错误消息就会被正确触发。

    下面是修改后的代码示例:

    import tkinter as tk
    from tkinter import messagebox
    
    # 创建一个主窗口
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口
    
    def validate_age(age):
        try:
            age = int(age)
            if age < 0:
                messagebox.showerror("输入错误", "请输入有效的年龄(正整数)。")
                return False
            return True
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的年龄(正整数)。")
            return False
    
    def validate_measurements(height, weight):
        try:
            height = float(height)
            weight = float(weight)
            if height <= 0 or weight <= 0:
                return False
            return True
        except ValueError:
            return False
    
    def check_parameters(age, height, weight):
        if not validate_age(age):
            messagebox.showerror("输入错误", "请输入正整数作为年龄。")
            return False
        if not validate_measurements(height, weight):
            messagebox.showerror("输入错误", "请输入正数作为所有的测量值。")
            return False
        return True
    
    def main():
        name = input('姓名: ')
        age = input('年龄: ')
        height = input('身高: ')
        weight = input('体重: ')
    
        if check_parameters(age, height, weight):
            print("参数校验通过!")
            # 在这里进行后续处理
        else:
            print("参数校验未通过,终止计算!")
    
    main()
    

    这样改动后,所有输入首先作为字符串处理。参数的验证逻辑移到了 check_parameters 函数中,这里进行类型转换和有效性检查。如果输入不合法,会弹出相应的错误消息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月22日
  • 已采纳回答 11月14日
  • 创建了问题 11月13日

悬赏问题

  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys