неділю, 24 грудня 2017 р.

Переміщення об'єктів Canvas за допомогою миші

Я вважаю, що вас як і мене дуже цікавило питання "Як розробити алгоритм для переміщення об'єктів полотна 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

Немає коментарів:

Дописати коментар

Динамічне програмування мовою Python

Ця тема не входить в шкільний курс інформатики, проте дуже часто представлена на олімпіаді з програмування. Динамічне програмування - це вж...