Tkinter方格纸程序在Python3中仅竖线加粗的异常问题排查
问题原因分析
这个问题的核心在于Python 2和Python 3中除法行为的差异:
- 在Python 2中,两个整数相除使用
/会执行整数除法(直接截断小数部分),所以A4_HEIGHT/SQUARE_SIDE计算结果是整数59(因为297*3=891,5*3=15,891/15=59.4,截断后取整为59)。 - 在Python 3中,
/默认执行浮点除法,结果是59.4这个浮点数。
这直接导致横线的循环逻辑失效:循环里count从59.4开始,每次减1后得到的是58.4、57.4……0.4这类值,这些浮点数对10取余永远不会等于0,所以lw始终是1,横线自然不会被加粗。而竖线那边A4_WIDTH/SQUARE_SIDE=210*3/(5*3)=42是整数,循环中count会出现40、30等10的倍数,因此竖线能正常应用加粗效果。
解决办法
把除法改成整数除法,用//运算符代替/,确保NSQUARES_H和NSQUARES_W都是整数类型:
''' SquaredPaper app, based on Canvas example from http://effbot.org/tkinterbook/tkinter-index.htm ''' # CONSTANTS A4Hmm = 297 A4Wmm = 210 PXperMM = 3 A4_HEIGHT = A4Hmm * PXperMM A4_WIDTH = A4Wmm * PXperMM SQUARE_SIDE = 5*PXperMM # 改用整数除法//,确保结果为整数 NSQUARES_H = A4_HEIGHT // SQUARE_SIDE NSQUARES_W = A4_WIDTH // SQUARE_SIDE from tkinter import * master = Tk() w = Canvas(master, width=A4_WIDTH, height=A4_HEIGHT) w.pack() paper = w.create_rectangle(0, 0, A4_WIDTH, A4_HEIGHT) count = NSQUARES_H pos = 0 while count > 0: lw = 1 if count%10 else 2 w.create_line(0, pos, A4_WIDTH, pos, width=lw) pos += SQUARE_SIDE count -= 1 count = NSQUARES_W pos = 0 while count > 0: lw = 1 if count%10 else 2 w.create_line(pos, 0, pos, A4_HEIGHT, width=lw) pos += SQUARE_SIDE count -= 1 mainloop()
修改后NSQUARES_H会是整数59,循环中count会依次递减到50、40……10这些10的倍数,对应的横线就会正常应用加粗效果了。你也可以用int(A4_HEIGHT/SQUARE_SIDE)强制转换为整数,效果和//一致,但//更直观体现整数除法的意图。
内容的提问来源于stack exchange,提问作者John White
相关产品推荐
相关产品推荐

