Python 为什么这个画布一个像素太大?

Python 为什么这个画布一个像素太大?,python,canvas,tkinter,Python,Canvas,Tkinter,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() 将Tkinter作为tk导入

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()
将Tkinter作为tk导入
root=tk.tk()
canvas=tk.canvas(根,宽度=100,高度=100)
canvas.grid(行=0,列=0)
def打印单击(事件):
打印事件.x,事件.y
canvas.bind(“”,打印\单击)
root.mainloop()
问题

单击左上方的画布将打印
(0,0)

单击右下角的画布将打印
(100100)
。我期望
(99,99)

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

在我的真实程序中,我在画布上显示一个数组(作为图像),需要精确的单击位置。如果基础映像中不存在该位置(即100x100阵列的
(100100)
),程序将崩溃

问题

  • 创建画布时我是否做错了什么?为什么它比预期的更宽、更高
  • 当设置需要宽度
    宽度
    和高度
    的画布时,这里的简单修复方法是从
    宽度
    高度
    中减去1吗

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

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

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

    在将
    borderwidth
    highlightthickness
    显式设置为零后,您是否尝试过复制结果?这两个因素都影响了画布的整体宽度和高度。@BryanOakley不,我没有。但我会立即尝试。@BryanOakley
    highlightthickness=0
    解决了这个问题!非常感谢,请随时发布答案。