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()
为什么这段代码输入非数值时无弹窗提示错误?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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
函数中,这里进行类型转换和有效性检查。如果输入不合法,会弹出相应的错误消息。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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