python - tkinter 画布未绘制顶部和左侧线
问题描述
我正在尝试使用 tkinter 画布绘制网格。逻辑相当简单:对于网格中的每个节点,我使用其左上角和右下角绘制一个矩形 [代码如下]。
问题是 tkinter 不会分别呈现第一列和第一行中节点的左边界和上边界。就像 tkinter 将画布偏移了一些小的像素。有配置来纠正这个吗?我目前的解决方法是从cellW
and中减去一些小的值cellH
,然后抵消每个节点的x1
and y1
...这非常hacky。
我没有做任何奇怪的事情,只是根窗口上的一个简单画布。
import tkinter as tk
winH = 400
winW = 400
ncols = 10
nrows = 10
cellW = winW / ncols
cellH = winH / nrows
class Node:
def __init__(self, row, col):
self.row = row
self.col = col
return
def generatGrid(nrows, ncols):
grid = []
for r in range(nrows):
row = [ Node(r, c) for c in range(ncols) ]
grid.append(row)
return grid
def drawNode(canvas, node):
x1 = cellW * node.col
y1 = cellH * node.row
x2 = x1 + cellW
y2 = y1 + cellH
canvas.create_rectangle(x1, y1, x2, y2)
return
def drawGrid(canvas, grid):
for row in grid:
for node in row:
drawNode(canvas, node)
return
window = tk.Tk()
canvas = tk.Canvas(window, width=winW, height=winH)
canvas.pack()
grid = generatGrid(nrows, ncols)
drawGrid(canvas, grid)
window.mainloop()
解决方案
我对画布感到恼火的一件事是边框是坐标空间的一部分。当您在左边缘画一条线时,它会被边框遮挡。
有配置来纠正这个吗?
是的。
您可以通过完全关闭与边框相关的属性来解决此问题:
canvas = tk.Canvas(window, width=winW, height=winH,
borderwidth=0, highlightthickness=0)
如果你想在画布周围有某种边框,你可以将画布放在一个框架中,并使用框架来绘制边框。
推荐阅读
- reactjs - 如何在 React 中调用可重用组件中的函数
- javascript - Discord.js Intellisense 无法处理子文件
- swift - 如何在 FSCalendar(Swift 5.0) 中增加特定日期的突出显示颜色
- amazon-web-services - AWS RDS 双向复制
- sql - SQL:左连接可选列应显示在表中,但行不同
- php - 数组 - 根据其他值添加值
- symfony - php8 上的“未定义常量“XML_PI_NODE””,在 Symfony 上安装了 php-xml / php8.0-xml
- php - 为 Google reCaptcha 实现 curl 到经过验证的服务器
- javascript - 如何使用 D3 使用 JSON 数据创建折线图
- iis - 设置 sitecore 本地实例时遇到统一错误