# Импортируем ткинтер
from tkinter import *
# Создаём окно
root = Tk()
# Создаём и размещаем холст
canvas = Canvas(root, width=500, height=500)
canvas.pack()
# Создаём объект овал на холсте
# if the oval is not filled, then only the line (border) is considered its body
# Если овал не заполнен, то лишь линия (граница) считается его телом
oval = canvas.create_oval(0, 0, 100, 100, fill='white')
# Описываем в функции действие, которое будет происходить при событии, совершаемом пользователем.
# А именно - берём координаты указателя мыши из event, и на их основе
# генерируем новые координаты, по которым будет перерисовываться овал.
def move_oval(event):
canvas.coords(oval, event.x - 50, event.y - 50, event.x + 50, event.y + 50)
# Связываем объект на холсте с "событием" и "действием"
canvas.tag_bind(oval, '<B1-Motion>', lambda :move_oval)
# Запускаем цикл исполнения
root.mainloop()
要按坐标移动画布上的形状,请使用坐标。
示例(通过单击画布我们移动圆圈):
对象在画布上(在画布上)的位置以坐标指定。这些坐标存储在画布上创建的对象本身中。要移动对象,必须在新位置重新绘制它。为此,您只需要更改其坐标即可。为此有一个 coords() 方法。有必要将对象的新坐标传递给它。
有些对象有一个简单的 x,y 坐标(例如文本)。但有些物体在太空中可能有更复杂的名称。例如创建椭圆时,需要通过:(left_border_by_x, bottom_border_by_y, right_border_by_x, upper_border_by_y)。
移动对象时,您需要传输与创建对象时相同类型的坐标,但对于我们移动对象的新位置。为此,您需要获取画布上指针位置的坐标,并根据它们在 coords() 方法中指定对象的新坐标。
为此,我们使用 tag_bind() 方法。在其中,我们将通过:
我们正在移动的对象的名称;
事件(用户执行的操作以及我们的程序对它的反应);
以及程序应该对用户提交的事件执行的操作。
这样做是这样的:class_instance_name_Canvas.tag_bind(object_name, event, action)。
bind() 方法对整个画布上的事件作出反应。如果您使用它,那么您将无法将事件绑定到特定对象。该事件将注册在画布的整个区域。
以下是用户可能发生的事件
代替“动作”,最好传递一个函数或方法。(我将举一个函数的例子)最好通过 lambda 来做到这一点。因此,该动作不会在程序启动时立即执行,而是只有当用户提交“事件”并且 coords() 方法将完全工作时,通过 lambda 启动“动作”。
coords() 方法将对象的坐标作为参数传递给“action”函数。要截取这些坐标,您需要在函数中提供一个参数。建议将其命名为 event
事件存储事件发生时指针的坐标。我们得到它们,并根据它们为我们的对象生成坐标,同时考虑到它的大小。
这是发生的事情: