Я вважаю, що вас як і мене дуже цікавило питання "Як розробити алгоритм для переміщення об'єктів полотна Canvas?". Адже хочеться, щоб користувачу було зручно користуватися нашою програмою, і вона виглядала більш професійно.
Отже, ні вбудованої функції ні загального алгоритму в Інтернеті немає, тому я пропоную свій класний для різних випадків.Ну конкретно найпростіший алгоритм виглядає так:
from tkinter import *
def fun(event):
canv.coords(oval, event.x, event.y, event.x+100, event.y+100)
root = Tk()
canv = Canvas(root, width=500, height=500, bg="white")
canv.pack()
x1 = 200
y1 = 200
oval = canv.create_oval([x1, y1], [x1+100, y1+100], fill="light blue")
canv.tag_bind(oval, "<B1-Motion>", fun)
root.mainloop()Спробуйте запустити цій алгоритм і ви побачите, що він працює. Але відбувається невеликий зсув круга тому, що x1 та y1 круга стають рівними event.x (положення курсора в даний момент часу по вісі X) та event.y (положення курсора в даний момент часу по вісі Y) відповідно, а курсор може знаходитися в будь-якій точці круга.
Для того, щоб зсуву не відбувалося, потрібно дізнатися відстань курсора до першої точки круга потрібно створити функцію, яка вирахує цю відстань при першому натисканні курсора на площину круга, а вже потім до попередніх точок буде додаватися ця відстань:
from tkinter import *
def fun(event):
global x, y
x = event.x-x1
y = event.y-y1
def fun1(event):
global x1, y1
canv.coords(oval, x1, y1, x1+100, y1+100)
x1 = event.x-x
y1 = event.y-y
root = Tk()
canv = Canvas(root, width=500, height=500, bg="white")
canv.pack()
x1 = 200
y1 = 200
oval = canv.create_oval([x1, y1], [x1+100, y1+100], fill="light blue")
canv.tag_bind(oval, "<Button-1>", fun)
canv.tag_bind(oval, "<B1-Motion>", fun1)
root.mainloop()Різницю між першим та другим алгоритмами ви зможете побачити на відео:
----------
Якщо у вас виникли запитання задайте їх в нашій групі в Facebook: https://www.facebook.com/groups/proginschool.forum/
Також рекомендуємо придбати посібники з програмування мовою Python для учнів 8-х та 9-х класів:
http://www.proginschool.inf.ua/posibnyk/8form.html
http://www.proginschool.inf.ua/posibnyk/9form.html
Немає коментарів:
Дописати коментар