Tkinter进度条代码仅输入86、93时报TypeError,如何兼容所有数值?
问题根因
- 函数返回值覆盖不全:你的
num函数没有覆盖所有执行分支,当today >= achieve且浮点数相等判断未命中时,循环执行结束后函数无显式返回,默认返回None,后续执行None / 10就触发了类型错误。 - 浮点数相等判断不可靠:二进制浮点数存在精度误差,直接用
==判断相等很容易出现看起来数值相等但判定为不等的情况,86、93就是刚好触发了精度问题的场景。 - 逻辑位置错误:
if today<achieve的判断和循环变量z无关联,放在循环内部属于无效逻辑,还可能导致分支判断异常。
修复方案
最小改动版本(只改bug不调整原有逻辑)
from tkinter import * app=Tk() app.title("progress") app.geometry("800x500+365+120") q={'weigh':100,'goal':75,'now':86} # 或'now':93 def bar(): # 清空之前生成的进度条Entry,避免多次点击重复累加 for widget in app.winfo_children(): if isinstance(widget, Entry): widget.destroy() first=int(q['weigh']) achieve=int(q['goal']) today=int(q['now']) def num(n): # 达标判断提到循环外,避免无效执行 if today < achieve: return 100 target_diff = first - today for z in range(0,n): y=(first-achieve)*(z/100) # 用差值小于极小阈值判断相等,规避浮点数精度问题 if abs(target_diff - y) < 1e-6: return z # 兜底返回,避免极端场景返回None return 0 rate=int(num(101)/10) for _ in range(1,rate+1): Entry(app,bg="blue",width=4).pack(side=LEFT) for _ in range(rate,10): Entry(app,width=4).pack(side=LEFT) Button(app,text="OK",command=bar).pack() app.mainloop()
优化版本(去掉无意义循环,直接算术计算进度)
原有num函数的循环逻辑完全可以用算术公式替代,执行效率更高,也不会出现浮点数相等判断的问题:
from tkinter import * app=Tk() app.title("progress") app.geometry("800x500+365+120") q={'weigh':100,'goal':75,'now':86} # 或'now':93 def bar(): # 清空旧进度条 for widget in app.winfo_children(): if isinstance(widget, Entry): widget.destroy() first = int(q['weigh']) achieve = int(q['goal']) today = int(q['now']) if today <= achieve: rate = 10 else: total_gap = first - achieve current_gap = first - today progress = current_gap / total_gap * 100 rate = int(progress / 10) for _ in range(rate): Entry(app,bg="blue",width=4).pack(side=LEFT) for _ in range(10 - rate): Entry(app,width=4).pack(side=LEFT) Button(app,text="OK",command=bar).pack() app.mainloop()
内容的提问来源于stack exchange,提问作者Kim minseong
相关产品推荐
相关产品推荐

