python - 为什么这个画布太大了一个像素?
问题描述
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 数组),程序将崩溃。
问题
- 我在创建画布时做错了什么?为什么它比预期的更宽和更高?
- 这里的简单解决方法是在设置需要具有宽度和高度的画布时
width
减去1吗?height
width
height
解决方案
width
除了和height
属性之外,还有其他因素会影响小部件的整体宽度和高度。例如,两者都borderwidth
有助于highlightthickness
小部件的整体大小。由于您没有将它们设置为零,因此您依赖于平台的默认值,而这些默认值显然不是零。
您需要将这些属性显式设置为零:
canvas = tk.Canvas(root, width=100, height=100, highlightthickness=0, borderwidth=0)
推荐阅读
- javascript - 尽管使用了 localStorage,但主题切换器不会通过刷新持续存在
- webpack - 如何使用文件加载器在 next.js 中加载 SVG 图像?
- python - 如何在保存到磁盘之前更改 Scrapy 抓取的网页的一部分?
- flutter - 无法在颤动中添加垂直线
- celery - 等待 celery 组中的所有任务完成或出错
- javascript - FCM 发送一批消息(设备组)
- javascript - 尝试使用 forEach 方法转换数组中的单词并将它们输出到页面上,但每个条目都会覆盖前一个条目?
- java - Swing GridBagLayout:将第二行的按钮居中
- javascript - 在 javascript 的文本中显示用户名和密码值
- c - 如何在不丢弃旧记忆的情况下使用 realloc 功能