首页 > 解决方案 > 为什么这个画布太大了一个像素?

问题描述

MCVE

import Tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=100, height=100)
canvas.grid(row=0, column=0)

def print_click(event):
    print event.x, event.y

canvas.bind('<Button-1>', print_click)

root.mainloop()

问题

单击最左上角的画布打印(0, 0)
单击右下角的画布打印(100, 100)。我预计(99, 99)

这意味着画布实际上是 101 像素宽和高,而不是 100。

在我的真实程序中,我在画布上显示一个数组(作为图像)并且需要精确的点击位置。如果底层图像中不存在该位置(即(100, 100)对于 100x100 数组),程序将崩溃。

问题

  1. 我在创建画布时做错了什么?为什么它比预期的更宽和更高?
  2. 这里的简单解决方法是在设置需要具有宽度和高度的画布时width减去1吗?heightwidthheight

标签: pythoncanvastkinter

解决方案


width除了和height属性之外,还有其他因素会影响小部件的整体宽度和高度。例如,两者都borderwidth有助于highlightthickness小部件的整体大小。由于您没有将它们设置为零,因此您依赖于平台的默认值,而这些默认值显然不是零。

您需要将这些属性显式设置为零:

canvas = tk.Canvas(root, width=100, height=100, highlightthickness=0, borderwidth=0)

推荐阅读