На этом шаге мы рассмотрим перемещение фигур по холсту.
Все графические методы возвращают идентификатор графической фигуры, который впоследствии можно использовать. Например, если прямоугольник создан инструкцией
rect = cnvs.create_rectangle(20, 50, 100, 100, fill="cyan"),
Canvas.delete(rect) .
Удалить все нарисованные фигуры можно командой
Canvas.delete(ALL) .
Использовать идентификаторы графических фигур можно также для сдвига, изменения свойств или даже для изменения формы. Для этого предназначены методы - модификаторы.
Для сдвига используется метод
Canvas.move(figure, deltaX, deltaY) ,
Canvas.itemconfig(figure[, опции]) .
Метод Canvas.coords(...) изменяет координаты "характеристических" точек фигуры.
Пример. Смещение, изменение формы, цвета и толщины линии геометрической фигуры. В примере мы рисуем овал. Клавиши управления курсором двигают его по холсту. Комбинация клавиш Ctrl+f случайным образом меняет цвет и толщину, а комбинация Ctrl+s задает случайный размер овала. Для последних двух команд в программе предусмотрены также кнопки.
from tkinter import * import random as rnd def rndcolor(): # случайный цвет bgr = ('#' + '{0:02x}'.format(rnd.randrange(0,256,1)) + '{0:02x}'.format(rnd.randrange(0, 256, 1)) + '{0:02x}'.format(rnd.randrange(0, 256, 1))) return bgr def moveoval(event): # смещение овала if event.keysym=='Right': cnvs.move(ovl, 10, 0) elif event.keysym=='Left': cnvs.move(ovl, -10, 0) elif event.keysym=='Up': cnvs.move(ovl, 0, -10) elif event.keysym=='Down': cnvs.move(ovl, 0, 10) def cnfgeoval(event): # изменение цвета и толщины линии cnvs.itemconfig(ovl, outline=rndcolor(), width=rnd.randint(1, 5)) def sizeoval(event): # изменение ширины и высоты овала crds = cnvs.coords(ovl) crds[2] = crds[0] + rnd.randint(50, 200) crds[3] = crds[1] + rnd.randint(50, 200) cnvs.coords(ovl, tuple(crds)) root = Tk() root.title("Изменение фигур") cnvs = Canvas(root, width=480, height=360, bg='#fafffa') cnvs.pack(expand=1, fill='both') ovl = cnvs.create_oval([20, 20], [120, 80], outline="blue", width=3) butCnf = Button(cnvs, text="Цвет - толщина", command=lambda: cnfgeoval(0)) cnvs.create_window(100, 340, window=butCnf, width = 110, height=26, anchor='w') butSize = Button(cnvs, text="Форма", command=lambda: sizeoval(0)) cnvs.create_window(270, 340, window=butSize, width = 110, height=26, anchor='w') root.bind('<Key>', moveoval) root.bind("<Control-KeyPress-f>", cnfgeoval) root.bind("<Control-s>", sizeoval) root.bind('<Control-z>',(lambda event: root.destroy())) root.mainloop()
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
Функция rndcolor() возвращает строку - значение случайного цвета. Функция moveoval(event) анализирует аргумент event на предмет определения, какая клавиша клавиатуры нажата. Если это одна из клавиш управления курсором, то вызывается метод холста move(), который смещает овал в нужном направлении. Функция cnfgeoval(event) с помощью метода холста itemconfig() меняет цвет и толщину эллипса, используя для них случайные значения. Функция sizeoval() меняет ширину и высоту прямоугольника, в который вписан эллипс. Вначале инструкция
crds = cnvs.coords(ovl)
cnvs.coords(ovl, tuple(crds))
Обратите внимание на то, что для списка crds потребовалось преобразование его в кортеж.
Функции moveoval(), cnfgeoval(), sizeoval() используются в качестве обработчиков событий нажатия на клавиши клавиатуры. Для двух последних функций также созданы лямбда-оболочки без аргумента, которые используются в опциях command кнопок, меняющих случайным образом цвет и толщину, а также размер эллипса.
Чтобы установить на холсте кнопки "Цвет - толщина" и "Форма" мы использовали метод create_window(). Его можно использовать вместо диспетчеров компоновки для размещения виджетов. Этот метод немного похож на упаковщик диспетчер компоновки place(position,...), поскольку имеет сходные с ним аргументы position.
На следующем шаге мы рассмотрим построение графиков функций с помощью виджета Canvas.