【问题标题】:tkinter canvas not drawing top and left linestkinter 画布未绘制顶部和左侧线
【发布时间】:2019-08-14 15:47:58
【问题描述】:

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

问题在于 tkinter 没有分别渲染第一列和第一行中节点的左边界和上边界。就像 tkinter 将画布偏移了一些小的像素。 是否有配置来纠正这个问题?我目前的解决方法是从cellWcellH 中减去一些小值,然后抵消每个节点的x1y1...这是非常哈基。

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

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

【问题讨论】:

  • 请提供minimal reproducible example - 您的代码缺少一些重要部分,导致我们无法运行您的代码。
  • @BryanOakley,我已经更新了代码。谢谢。

标签: python tkinter tkinter-canvas


【解决方案1】:

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

是否有配置可以纠正这个问题?

是的。

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

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

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

【讨论】:

  • 这是一个晦涩但有效的解决方法。非常感谢。
  • @eyeezzi:我同意。
  • 为什么在tk.Canvas@BryanOakley 使用 tk 属性
  • @Programmer: 因为原来的问题就是这样导入的。
  • OK @BryanOakley 我在主程序中没有看到。我的错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多