Python TKinter - 在 canvas 中绘制的移动多边形对象

Python TKinter - Moving polygon objects drawn within a canvas

我是 Tkinter 编程的新手,被要求编写一个程序,使用按钮在 canvas 上绘制多边形,然后能够单击并将这些多边形拖动到位。我能够使用链接到“获取域”按钮的函数绘制多边形,并且我已经使用 canvas.tag_bind 到该块以将鼠标点击绑定到移动多边形。我的问题是,当我单击并拖动多边形时,它会移动绘制多边形的整个 canvas。这段代码中有没有办法指定如何只移动多边形?

#!/usr/bin/python
import re
import sys
import os
import tkinter as tk

HEIGHT = 1200
WIDTH  = 1600

def domain_button(canvas):
    domain  = canvas.create_polygon([420, 100, 420, 100, 420, 175, 420, 175, 380, 175, 380, 120, 420, 120], outline='#000000',fill='#007ECB', width=2, tags="obj1Tag")
    canvas.tag_bind(domain,"<Button-1>", drag_start)
    canvas.tag_bind(domain,"<B1-Motion>", drag_motion)

def button_hover(e):
    button["bg"] = "white"
    status_label.config(text="Get Input")
def button_hover_leave(e):
    button["bg"] = "grey"
    status_label.config(text="")
def button_hover_polygon(label):
    status_label.config(text=label)
def button_hover_polygon_leave(e):
    status_label.config(text="")
def drag_start(e):
    domain = e.widget
    domain.startX = e.x
    domain.startY = e.y

def drag_motion(e):
    domain = e.widget
    x = domain.winfo_x() - domain.startX + e.x
    y = domain.winfo_y() - domain.startY + e.y
    domain.place(x=x,y=y)



###############Main programme#######################

root = tk.Tk()

canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH, bg='#E7E0E6')
canvas.pack()

frame = tk.Frame(root, bg = '#80c1ff',bd=5)
frame.place(relwidth=1,relheight=1)

###Input box
textBox = tk.Text(frame, font=40)
textBox.place(relx=0.01,rely = 0.05, relwidth=0.4,relheight=0.3)

###Option box
frame2 = tk.Frame(frame, bg = '#D3D3D3')
frame2.place(relx=0.01, rely = 0.45,relheight = 0.35, relwidth = 0.4)
InsertVLDomainButton= tk.Button(frame2,text="insert domain",bg = "grey", command=lambda: domain_button(lower_canvas))
InsertVLDomainButton.place(relx = 0.01, rely = 0.01, relheight = 0.2, relwidth=0.2)


status_label = tk.Label(root, text='test', bd=1)
status_label.place(rely = 0.98, relheight = 0.02, relwidth = 1)

##Big button
button = tk.Button(frame, text = "Go!", bg = "grey", font=40, command=lambda: pipeline(lower_canvas))
button.place(relx=0.1,rely=0.85,relheight=0.1, relwidth=0.2)
button.bind("<Enter>", button_hover)
button.bind("<Leave>", button_hover_leave)

###Results canvas

lower_frame = tk.Frame(root, bg = '#80c1ff', bd=10)
lower_frame.place(relx=0.45, rely=0.05, relwidth=0.55,relheight=0.9)

lower_canvas = tk.Canvas(lower_frame)
lower_canvas.place(relheight=1,relwidth=1)




root.mainloop()

我不确定我是否遗漏了一些明显的东西。我承认我从在线教程中获取了移动多边形的功能。

提前致谢!

这可能对您有所帮助。这是简单的创建按钮和 拖动代码:

from tkinter import *
from tkinter.dnd import Tester as DragWindow, Icon as Draggable

root = Tk()
root.geometry("800x600")
root.withdraw()  # hide root window
# Make the actual main window, which can have draggable objects on.
main = DragWindow(root)


def make_btn():
    """Make a new test button."""
    # The functional part of the main window is the canvas.
    Draggable('Button').attach(main.canvas)


Button(main.top, text='Create New Button', command=make_btn).pack()
mainloop()