在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
方法移动对象并获取移动后的坐标。