Python终端文本着色异常求助:FPS百分比显示异常如何修复?
终端输出FPS时颜色格式异常的问题排查与修复
问题描述
运行以下Python代码:
import time s = time.time_ns()/1000000 en = time.time_ns()/1000000 ma = 0 while True: e = time.time_ns()/1000000 if s - en >= 1000: ma = max(ma,int(1/(e-s))) hi = int(((1/(e-s))/ma)*100) jk = {hi>50:[int(((hi-50)/50)*255)-255, 255], hi<=50:[255, (((hi)/50)*255)]}[True] print("\033[A\033[K\033[A{:>5}fps {:>3}%\033[0;0m".format(int(1/(e-s)), "\033[38;2;{};{};0m{}".format(jk[0], int(jk[1]), hi))) en = time.time_ns()/1000000 time.sleep(0.001) s = time.time_ns()/1000000
当hi变量大于50时,终端输出异常:
95fps 214.2;255;0m58%
期望输出应为:
75fps 75% (75%是彩色的)
问题原因
- ANSI颜色值非法:当
hi>50时,计算jk[0]的公式int(((hi-50)/50)*255)-255会得到负数(比如hi=58时,计算得((8/50)*255)-255=40.8-255=-214.2,取整后是-214),而终端的ANSI RGB颜色值范围是0-255,负数会导致终端无法正确解析颜色代码,直接输出原始字符串。 - 字典取值逻辑错误:
{hi>50:[...], hi<=50:[...]}[True]写法逻辑混乱,字典的键是hi>50和hi<=50的布尔结果,用[True]取值属于侥幸匹配,可读性极差且容易引发逻辑错误。 - 输出格式拼接错误:颜色代码没有正确包裹百分比数字,导致部分ANSI代码直接暴露在输出内容中。
修复方案
修正后的代码
import time s = time.time_ns() / 1000000 en = time.time_ns() / 1000000 ma = 0 while True: e = time.time_ns() / 1000000 if s - en >= 1000: current_fps = int(1 / (e - s)) ma = max(ma, current_fps) hi = int((current_fps / ma) * 100) # 修正颜色值计算,确保RGB值在0-255范围内 if hi > 50: # 从黄色(255,255,0)过渡到红色(255,0,0) green = int(255 - ((hi - 50) / 50) * 255) red = 255 else: # 从绿色(0,255,0)过渡到黄色(255,255,0) red = int((hi / 50) * 255) green = 255 blue = 0 # 正确拼接ANSI颜色代码与输出内容 color_code = f"\033[38;2;{red};{green};{blue}m" reset_code = "\033[0m" print(f"\033[A\033[K{:>5}fps {color_code}{hi:>3}%{reset_code}") en = time.time_ns() / 1000000 time.sleep(0.001) s = time.time_ns() / 1000000
关键修改点
- 颜色值范围修正:重新设计渐变逻辑,
hi>50时绿色从255线性降到0,hi<=50时红色从0线性升到255,确保所有RGB值在0-255合法范围内。 - 替换错误的字典取值:用清晰的
if-else条件判断替代原本混乱的字典取值逻辑,代码可读性更强。 - 优化输出格式:调整ANSI控制码位置,确保颜色代码正确包裹百分比数字,同时移除多余的光标上移指令,避免输出混乱。
内容的提问来源于stack exchange,提问作者Mohamed Ali Martins Agoussine
相关产品推荐
相关产品推荐

