在不使画布下部可拖动的情况下:
from tkinter import *
from PIL import Image, ImageTk
def on_drag(event):
x, y = event.x, event.y
cw1.coords(image_id, x, y)
def on_drop(event):
global image_id
x, y = event.x, event.y
abs_x = cw1.winfo_rootx() + x
abs_y = cw1.winfo_rooty() + y
cw2_x = cw2.winfo_rootx()
cw2_y = cw2.winfo_rooty()
cw2_width = cw2.winfo_width()
cw2_height = cw2.winfo_height()
if cw2_x <= abs_x <= cw2_x + cw2_width and cw2_y <= abs_y <= cw2_y + cw2_height:
cw1.delete(image_id)
new_x = abs_x - cw2_x
new_y = abs_y - cw2_y
image_id = cw2.create_image(new_x, new_y, image=image1, tags='image1Tag')
win = Tk()
win.geometry("650x650")
win.title("Draggable Image Between Canvases")
cw1 = Canvas(win, width=350, height=350, bg="khaki2")
cw1.pack(fill="both", expand=True)
cw2 = Canvas(win, width=350, height=350, bg="salmon")
cw2.pack(fill="both", expand=True)
image1 = ImageTk.PhotoImage(Image.open("plot.png").resize((100, 100), Image.Resampling.BICUBIC))
image_id = cw1.create_image(150, 150, image=image1, tags='image1Tag')
cw1.tag_bind(image_id, "<B1-Motion>", on_drag)
cw1.tag_bind(image_id, "<ButtonRelease-1>", on_drop)
win.mainloop()
要使图像在两个画布中可拖动:
from tkinter import *
from PIL import Image, ImageTk
def on_drag(event):
x, y = event.x, event.y
event.widget.coords(image_id, x, y)
def on_drop(event):
global image_id, current_canvas
x, y = event.x, event.y
abs_x = event.widget.winfo_rootx() + x
abs_y = event.widget.winfo_rooty() + y
target_canvas = None
if cw1.winfo_rootx() <= abs_x <= cw1.winfo_rootx() + cw1.winfo_width() and \
cw1.winfo_rooty() <= abs_y <= cw1.winfo_rooty() + cw1.winfo_height():
target_canvas = cw1
elif cw2.winfo_rootx() <= abs_x <= cw2.winfo_rootx() + cw2.winfo_width() and \
cw2.winfo_rooty() <= abs_y <= cw2.winfo_rooty() + cw2.winfo_height():
target_canvas = cw2
if target_canvas and target_canvas != current_canvas:
current_canvas.delete(image_id)
new_x = abs_x - target_canvas.winfo_rootx()
new_y = abs_y - target_canvas.winfo_rooty()
image_id = target_canvas.create_image(new_x, new_y, image=image1, tags='image1Tag')
current_canvas = target_canvas
target_canvas.tag_bind(image_id, "<B1-Motion>", on_drag)
target_canvas.tag_bind(image_id, "<ButtonRelease-1>", on_drop)
win = Tk()
win.geometry("650x650")
win.title("Draggable Image Between Canvases")
cw1 = Canvas(win, width=350, height=350, bg="khaki2")
cw1.pack(fill="both", expand=True)
cw2 = Canvas(win, width=350, height=350, bg="salmon")
cw2.pack(fill="both", expand=True)
image1 = ImageTk.PhotoImage(Image.open("plot.png").resize((100, 100), Image.Resampling.BICUBIC))
image_id = cw1.create_image(150, 150, image=image1, tags='image1Tag')
current_canvas = cw1
cw1.tag_bind(image_id, "<B1-Motion>", on_drag)
cw1.tag_bind(image_id, "<ButtonRelease-1>", on_drop)
win.mainloop()
请检查代码。非常感谢。