холст tkinter не рисует верхнюю и левую линии - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь нарисовать сетку с помощью tkinter canvas.Логика довольно проста: для каждого узла в сетке я рисую прямоугольник, используя его верхний левый и нижний правый углы [код ниже].

Проблема в том, что tkinter не отображает левую и верхнюю границы узлов в первом столбце и строке соответственно.Как будто tkinter смещает холст на небольшое количество пикселей. Есть ли конфигурация, чтобы исправить это? Мой текущий способ - вычесть небольшое значение из cellW и cellH, а затем сместить x1 и y1 каждого узла ... это очень хакерский,missing left and top borders

Я не делаю ничего странного, просто простое полотно в корневом окне.

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()

1 Ответ

0 голосов
/ 26 марта 2019

Одна из вещей, которые меня раздражают в холсте, это то, что граница является частью координатного пространства.Когда вы рисуете линию на левом краю, она затеняется границей.

Есть ли конфиг, чтобы исправить это?

Да.

Вы можете обойти это, полностью отключив атрибуты, связанные с границей:

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

Если вы хотите иметь какую-то границу вокруг холста, вы можете поместить холст врамка, и используйте рамку, чтобы нарисовать границу.

...