Вам необходимо использовать уникальный тег для каждой коллекции элементов холста, которые составляют единственные ворота.Затем вы можете переместить все элементы вместе, используя этот уникальный тег.
Чтобы упростить реализацию, я проиллюстрирую это, используя глобальную переменную для идентификатора каждого нового шлюза.Использование глобальной переменной не лучшее решение, но, безусловно, самое простое.
Также, чтобы упростить этот ответ, мы добавим привязку для каждого тега, которая передает тег в функцию перемещения.,Также возможно иметь единственную привязку для холста, которая сначала определит, по каким воротам щелкнули.В этом ответе мы сделаем его простым и создадим уникальную привязку для каждого шлюза.
Сначала нам нужно изменить moveANDgate
, чтобы он принимал уникальный тег, чтобы он знал, какой из них необходимобыть перемещен:
def moveANDGate(event, tag):
x=event.x
y=event.y
coords=canvas.coords(tag)
movex=x-coords[0]
movey=y-coords[1]
canvas.move(tag, movex, movey)
Далее нам нужно создать глобальную переменную, которую мы можем использовать для генерации уникального тега.затем мы можем использовать эту переменную внутри andGATE
, чтобы создать тег и добавить его ко всем элементам на холсте.Затем нам нужно привязать функцию к событию <B1-Motion>
для нашего нового тега .:
gate_id = 0
def andGATE():
global gate_id
gate_id += 1
gate_tag = "andgate-%s" % gate_id
tags = ("andgate", gate_tag)
canvas.create_line(150, 50, 150, 150, width=5, tags=tags)
canvas.create_arc(150, 50, 200, 150, start=90, extent=-180, width=5, fill="black", tags=tags)
canvas.create_line(150, 75, 120, 75, width=5, tags=tags)
canvas.create_line(150, 120, 120, 120, width=5, tags=tags)
canvas.create_line(200, 100, 250, 100, width=5, tags=tags)
canvas.create_rectangle(150, 50, 180, 150, width=5, fill="black", tags=tags)
canvas.tag_bind(gate_tag, "<B1-Motion>", lambda event, tag=gate_tag: moveANDGate(event, tag))
В этом примере я даю каждому элементу два тега: один, который является статической строкой "andgate",и тот, который имеет идентификатор.Это позволяет сделать что-то для всех объектов andgate одновременно или сделать что-то для определенного andgate.Думайте о "andgate"
как об имени класса, а "andgate-<number>"
как об имени экземпляра.Это не совсем то, что они есть, но логически это то, как они используются.