python - tkinter Canvas 不绘制顶部和左侧的线

标签 python tkinter tkinter-canvas

我正在尝试使用 tkinter Canvas 绘制网格。逻辑非常简单:对于网格中的每个节点,我使用其左上角和右下角绘制一个矩形[下面的代码]。

问题是 tkinter 不会分别渲染第一列和第一行中节点的左边框和上边框。这就像 tkinter 将 Canvas 偏移了一些小像素。 是否有配置可以纠正此问题?我当前的解决方法是从 cellWcellH 中减去一些小值,然后偏移每个节点的 x1y1...这非常 hacky。 missing left and top borders

我没有做任何奇怪的事情,只是在根窗口上做一个简单的 Canvas 。

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 令人烦恼的一件事是边框是坐标空间的一部分。当您在左边缘绘制一条线时,它会被边框遮挡。

Is there a config to correct this?

是的。

您可以通过完全关闭与边框相关的属性来解决此问题:

canvas = tk.Canvas(window, width=winW, height=winH, 
                   borderwidth=0, highlightthickness=0)

如果你想在 Canvas 周围有某种边框,可以将 Canvas 放在框架中,然后使用框架来绘制边框。

关于python - tkinter Canvas 不绘制顶部和左侧的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55320249/

相关文章:

python - 成功打破了我的venv;可以修复吗?

python - 关闭时进程不会结束

python - 绘图时忽略 Matplotlib rcParams

python - 如何检查 Canvas 是否为空?

python - 使用列表理解为列表元素添加前缀

python - 验证列内容时解析表元素的 lxml 语法错误

python - Paramiko 服务器 : Signalling the client that stdout is closed

Python Tkinter 错误, "Too Early to Create Image"

python - 在 tkinter 上使用 GUI 显示 pdf 页面

python - 在 python tkinter Canvas 中更改线的坐标