tkinter - 为什么会有像 bbox 这样的东西?

Atl*_*435 4 python tkinter tkinter-canvas

现在我更多地使用 tkinter Canvas,我想知道 bbox 的使用。

对我来说,我使用 bbox 来获取元素的坐标,但画布已经有一个方法来返回一个项目的坐标。那么他们为什么要发明像 bbox 这样的东西呢?

这里比较官方的 tcl 描述:

盒子

pathName bbox tagOrId ?tagOrId tagOrId ...?

返回一个包含四个元素的列表,为由 tagOrId 参数命名的所有项目提供一个近似边界框。该列表的形式为“x1 y1 x2 y2”,因此所有命名元素的绘制区域都在由左侧 x1、右侧 x2、顶部 y1 和底部 y2 限定的区域内。返回值可能会高估实际边界框几个像素。如果没有项目与任何 tagOrId 参数匹配,或者如果匹配的项目有空的边界框(即它们没有可显示的内容),则返回一个空字符串。

坐标

pathName coords tagOrId ?coordList?

查询或修改定义项目的坐标。如果未指定坐标,则此命令返回一个列表,其元素是由 tagOrId 命名的项目的坐标。如果指定了坐标,则它们将替换命名项的当前坐标。如果 tagOrId 引用多个项目,则使用显示列表中的第一个。

我看到了这些之间的区别,但无法成像,在这种情况下我需要一个 bbox 而不是坐标?有人可以教我更好地理解这一点吗?

j_4*_*321 7

不同之处在于,bbox()您可以获得一组项目的边界框(使用标签或“全部”),同时coords()返回具有给定标签的第一个项目的坐标。这是一个例子

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root)
canvas.pack()

i1 = canvas.create_rectangle(10, 10, 30, 50, tags='rect')
i2 = canvas.create_rectangle(60, 80, 70, 120, fill='red', tags='rect')

canvas.update_idletasks()
print('bbox', canvas.bbox('rect'))
print('coords', canvas.coords('rect'))
Run Code Online (Sandbox Code Playgroud)

这使

盒子

(9, 9, 71, 121)

坐标

[10.0, 10.0, 30.0, 50.0]

的一个典型用途bbox()是当您想使用画布滚动一组小部件时:画布的滚动区域需要设置为包括所有画布内容,因此canvas.bbox('all')非常有用。例如,参见在 Tkinter中将滚动条添加到一组小部件(在onFrameConfigure()函数中)。