python 使用 tkinter + turtle 通过鼠标点击画布的某处,移动已经绘制好的图形
import turtle
import tkinter as tk
root = tk.Tk()
root.geometry('500x500')
cv = tk.Canvas(root, height=500, width=500, bg='white')
cv.pack()
pen = turtle.RawTurtle(cv)
#圆移动前后的圆心位置
old_x = 0
old_y = 150
new_x = 0
new_y = 150
#画圆
def drawCicle():
pen.penup()
pen.sety(150)
pen.fillcolor('yellow')
pen.begin_fill()
pen.color('yellow')
pen.circle(30)
pen.end_fill()
pen.pendown()
pen.penup()
pen.home()
#移动
def move(old_x,old_y,new_x,new_y):
#因为tkinter 和 turtle 的坐标体系不同,要转换
x = old_x + 250
y = 250 - old_y
allID = cv.find_closest(x,y)
click_id = allID[0]
cv.move(click_id,new_x-250,250-new_y)
#获取鼠标位置并移动
def cursorxy(event):
global old_x,old_y,new_x,new_y
old_x = new_x
old_y = new_y
new_x = event.x - 250
new_y = 250 - event.y
move(old_x,old_y,new_x,new_y)
def main():
cv.bind("<Double-Button-1>",cursorxy)
drawCicle()
root.mainloop()
if __name__ == '__main__':
main()
运行结果:无论鼠标怎么点击 ,圆没有移动
圆移动到鼠标点击的位置
import turtle
import tkinter as tk
root = tk.Tk()
root.geometry('500x500')
cv = tk.Canvas(root, height=500, width=500, bg='white')
cv.pack()
pen = turtle.RawTurtle(cv)
# 圆移动前后的圆心位置
old_x = 0
old_y = 150
new_x = 0
new_y = 150
# 画圆
def drawCicle():
pen.penup()
pen.sety(150)
pen.fillcolor('yellow')
pen.begin_fill()
pen.color('yellow')
pen.circle(30)
pen.end_fill()
pen.pendown()
pen.penup()
pen.home()
# 移动
def move(old_x, old_y, new_x, new_y):
# 因为tkinter 和 turtle 的坐标体系不同,要转换
x = old_x + 250
y = 250 - old_y
allID = cv.find_closest(x, y)
click_id = allID[0]
cv.move(click_id, new_x - 250, 250 - new_y)
# 获取鼠标位置并移动
def cursorxy(event):
global old_x, old_y, new_x, new_y
old_x = new_x
old_y = new_y
new_x = event.x - 250
new_y = 250 - event.y
move(old_x, old_y, new_x, new_y)
def main():
cv.bind("<Double-Button-1>", cursorxy)
drawCicle()
root.mainloop()
if __name__ == '__main__':
main()
修改此处(同时可以将move()
函数删除、new_x
和new_y
这两个全局变量删除):
# 获取鼠标位置并移动
def cursorxy(event):
global old_x, old_y # , new_x, new_y
# old_x = new_x
# old_y = new_y
# new_x = event.x - 250
# new_y = 250 - event.y
# move(old_x, old_y, new_x, new_y)
for i in cv.find_all():
cv.move(i, event.x - old_x, event.y - old_y)
old_x = event.x
old_y = event.y