首页 > 解决方案 > tkinter 画布未绘制顶部和左侧线

问题描述

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

问题是 tkinter 不会分别呈现第一列和第一行中节点的左边界和上边界。就像 tkinter 将画布偏移了一些小的像素。有配置来纠正这个吗?我目前的解决方法是从cellWand中减去一些小的值cellH,然后抵消每个节点的x1and 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()

标签: pythontkintertkinter-canvas

解决方案


我对画布感到恼火的一件事是边框是坐标空间的一部分。当您在左边缘画一条线时,它会被边框遮挡。

有配置来纠正这个吗?

是的。

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

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

如果你想在画布周围有某种边框,你可以将画布放在一个框架中,并使用框架来绘制边框。


推荐阅读