Tkinter 如何在画布中获取对象的坐标

在Tkinter的画布(Canvas)中,我们可以绘制各种图形和文本,但是在绘制后,我们可能需要知道这些对象的坐标,以便后续进行一些操作,例如移动、删除、修改等等。

获取鼠标点击的坐标

我们先来看如何获取鼠标点击的坐标。当鼠标在画布上点击时,我们可以通过绑定鼠标点击事件(<Button-1>表示左键点击)来获取鼠标点击的坐标,代码如下:

from tkinter import *

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

root = Tk()
canvas = Canvas(root, width=300, height=200)
canvas.pack()
canvas.bind('<Button-1>', canvas_click)
root.mainloop()

上面的代码中,我们创建了一个画布,绑定了鼠标点击事件<Button-1>,并在事件处理函数canvas_click中获取了鼠标点击的坐标event.x, event.y。当我们在画布上左键点击时,控制台会输出点击的坐标。

获取对象的坐标

接下来,我们来看如何获取画布上某个对象的坐标。绝大部分情况下,绘制对象时我们都会保存它们的id(即创建时返回的对象id),我们可以通过这个id获取对象的坐标。

from tkinter import *

def get_obj_coords(canvas, obj_id):
    coords = canvas.coords(obj_id)
    return coords

root = Tk()
canvas = Canvas(root, width=300, height=200)
canvas.pack()

# 绘制一个矩形,并保存下来它的id
rect_id = canvas.create_rectangle(50, 50, 150, 100, fill='red')

# 获取矩形的坐标
rect_coords = get_obj_coords(canvas, rect_id)
print(rect_coords)

root.mainloop()

上面的代码中,我们绘制了一个矩形,并保存了它的id。接着,我们定义了一个函数get_obj_coords,用于获取某个对象的坐标。在绘制矩形后,我们调用了get_obj_coords函数获取了矩形的坐标,并输出了结果。运行代码后,控制台会输出矩形的坐标([50.0, 50.0, 150.0, 100.0])。

需要注意的是,不同类型的对象获取坐标的方法可能不同,上面的代码只适用于矩形对象。

获取所有对象的坐标

如果我们需要获取画布上所有对象的坐标,可以使用find_all方法获取画布上的所有对象id,然后遍历这些id,调用上面定义的get_obj_coords函数获取每个对象的坐标。

from tkinter import *

root = Tk()
canvas = Canvas(root, width=300, height=200)
canvas.pack()

# 绘制一些图形,保存下来它们的id
rect_id = canvas.create_rectangle(50, 50, 150, 100, fill='red')
oval_id = canvas.create_oval(200, 50, 250, 100, fill='green')
text_id = canvas.create_text(100, 150, text='Hello', fill='blue')

# 定义获取所有对象坐标的函数
def get_all_obj_coords(canvas):
    all_ids = canvas.find_all()
    all_coords = [get_obj_coords(canvas, obj_id) for obj_id in all_ids]
    return all_coords

# 获取所有对象的坐标
all_coords = get_all_obj_coords(canvas)
print(all_coords)

root.mainloop()

上面的代码中,我们绘制了三个对象,并保存了它们的id。接着,我们定义了一个函数get_all_obj_coords,用于获取画布上所有对象的坐标。在函数中,我们先使用find_all方法获取画布上的所有对象id,然后遍历这些id,调用上面定义的get_obj_coords函数获取每个对象的坐标,并将结果保存在一个列表中。最后,我们调用get_all_obj_coords函数获取所有对象的坐标,并输出结果。运行代码后,控制台会输出所有对象的坐标。

移动对象并获取坐标

最后,我们来看如何移动画布上的对象,并获取移动后的坐标。

from tkinter import *

root = Tk()
canvas = Canvas(root, width=300, height=200)
canvas.pack()

# 绘制一个矩形,并保存下来它的id
rect_id = canvas.create_rectangle(50, 50, 150, 100, fill='red')

# 移动矩形,并获取移动后的坐标
canvas.move(rect_id, 50, 50)
rect_coords = get_obj_coords(canvas, rect_id)
print(rect_coords)

root.mainloop()

上面的代码中,我们先绘制了一个矩形,并保存了它的id。接着,我们调用了move方法将矩形移动了50个像素的横向距离和50个像素的纵向距离。最后,我们调用上面定义的get_obj_coords函数获取矩形移动后的坐标,并输出结果。运行代码后,控制台会输出矩形移动后的坐标。

结论

在Tkinter的画布中,获取对象的坐标可以帮助我们进行一些后续操作,例如移动、删除、修改等等。我们可以通过绑定鼠标点击事件来获取鼠标点击的坐标,通过对象的id获取对象的坐标,通过find_all方法获取所有对象id并遍历获取所有对象的坐标,以及通过move方法移动对象并获取移动后的坐标。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程