Шаг 70.
Библиотека Tkinter. Компоненты и вспомогательные классы. Нестилизуемые компоненты. Компонент Canvas: векторная графика (окончание)

    На этом шаге мы рассмотрим перемещение фигур по холсту.

    Все графические методы возвращают идентификатор графической фигуры, который впоследствии можно использовать. Например, если прямоугольник создан инструкцией

  rect = cnvs.create_rectangle(20, 50, 100, 100, fill="cyan"), 
то удалить его можно командой
  Canvas.delete(rect)         . 

    Удалить все нарисованные фигуры можно командой

  Canvas.delete(ALL)  .

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

    Для сдвига используется метод

  Canvas.move(figure, deltaX, deltaY) , 
где figure - идентификатор фигуры, deltaX, deltaY - смещения вдоль осей X и Y. Для изменения свойств фигуры (цвета, толщины линии и т.д.) можно использовать метод
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) 
определяет список crds четырех чисел - координат описанного прямоугольника. Затем два последних числа из этого списка корректируются случайным образом. В конце инструкция
  cnvs.coords(ovl, tuple(crds)) 
присваивает новые координаты овалу.

    Обратите внимание на то, что для списка crds потребовалось преобразование его в кортеж.

    Функции moveoval(), cnfgeoval(), sizeoval() используются в качестве обработчиков событий нажатия на клавиши клавиатуры. Для двух последних функций также созданы лямбда-оболочки без аргумента, которые используются в опциях command кнопок, меняющих случайным образом цвет и толщину, а также размер эллипса.

    Чтобы установить на холсте кнопки "Цвет - толщина" и "Форма" мы использовали метод create_window(). Его можно использовать вместо диспетчеров компоновки для размещения виджетов. Этот метод немного похож на упаковщик диспетчер компоновки place(position,...), поскольку имеет сходные с ним аргументы position.

    На следующем шаге мы рассмотрим построение графиков функций с помощью виджета Canvas.




Предыдущий шаг Содержание Следующий шаг