You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:25:45