Python 3.6.1中Tkinter askcolor返回错误RGB值的问题求助
嘿,这个问题我之前也碰到过!其实是因为askcolor()返回的RGB值是浮点类型的,底层计算时会有一些精度上的小偏差——比如你选的255会变成255.99609375,128变成128.5,而你用format(x, "1.0f")的时候,会把这些值严格四舍五入成整数,就出现了256这种超出RGB范围的结果。
给你两个简单的解决方案,都能得到你预期的255 0 128:
方案一:直接截断小数部分(最贴合你的预期)
直接用int()把每个浮点值转成整数,它会自动去掉小数部分,刚好符合RGB整数的需求:
from tkinter.colorchooser import askcolor color = askcolor() if color[0] is not None: # 别忘了处理用户取消选择的情况 rgb_tuple = color[0] rgb_int = tuple(int(x) for x in rgb_tuple) # 转成整数元组 color_result_rgb = ' '.join(map(str, rgb_int)) print(color_result_rgb) # 输出:255 0 128
方案二:四舍五入后限制在0-255范围内
如果想要更精准的四舍五入,同时确保值不会超出RGB的0-255范围,可以用round()再加个范围限制:
from tkinter.colorchooser import askcolor color = askcolor() if color[0] is not None: rgb_tuple = color[0] # 四舍五入后转整数,同时确保不超过255、不低于0 rgb_int = tuple(max(0, min(255, int(round(x)))) for x in rgb_tuple) color_result_rgb = ' '.join(map(str, rgb_int)) print(color_result_rgb) # 输出:255 0 128
简单说下原代码的问题:format(x, "1.0f")会严格遵循四舍五入规则,255.996这种接近256的值就会被转成256,但RGB的整数取值范围是0到255,所以直接截断或者做范围限制就完美解决啦!
内容的提问来源于stack exchange,提问作者Justyna Stępniak
相关产品推荐
相关产品推荐

