Kodomo

Пользователь

Дополнительное про графические интерфейсы

Раньше мы использовали Canvas (полотно) для рисования растровых картинок с привлечением PhotoImage. В PhotoImage заключен один недостаток: там мы не можем создавать различные примитивы ( круги, линии, прямоугольники и пр.). Теперь перейдем к рисованию векторных картинок (состоящих из заранее предопределенных объектов, чьи свойства мы можем менять).

Пример 1

   1 from Tkinter import Tk, Canvas
   2 root = Tk()
   3 canvas = Canvas(root, width=200, height=200) #Задаем полотно и прописываем его параметры: ширину, высоту, цвет fill и пр.
   4 canvas.pack()
   5 root.mainloop()

В результате появится квадратное полотно со стороной в 200. Теперь что-нибудь в него посадим.

Пример 2

   1 from Tkinter import Tk, Canvas
   2 root = Tk()
   3 canvas = Canvas(root, width=200, height=200)
   4 canvas.pack()
   5 canvas.create_line(0, 0, 100, 0, 200, 200, fill="red")#Создаем линию, составленную из двух отрезков, координаты концов которых указаны. Напоминаю, что точка (0, 0) находится в верхнем левом углу, а координатные оси направлены вправо и вниз.
   6 root.mainloop()

Положим в центр векторного полотна растровую картинку.

Пример 3

   1 from Tkinter import Tk, Canvas, PhotoImage
   2 root = Tk()
   3 canvas = Canvas(root, width=200, height=200)
   4 canvas.pack()
   5 image=PhotoImage(width=50, height=50)# Указываем размеры растровой картинки.
   6 image.put("green", to=[15, 15, 15+10, 15+10])# положим в нашу растровую картинку новый прямоугольник размером 10 на 10. NB координаты отсчитываются относительно растровой картинки.
   7 image.put("red", to=[10, 10])# положим в неё красную точку.
   8 canvas.create_image(100, 100, image=image)# Указываем центр фигуры. Забавно, здесь image выступает и как параметр функции, и как переменная.
   9 root.mainloop()

Чтобы создать круг, нужно задать canvas.create_oval(0, 50, 100, 150, fill="blue") - т.е. мы указываем вершины прямоугольника, в который вписан овал.

Пример 4

Теперь поднимемся на более высокий уровень мастерства - заставим программу реагировать на на движение мыши, нажатие кнопки пр.

   1 from Tkinter import Tk, Canvas
   2 def on_a(a):
   3       print "Hello" #Ввели новую функцию.
   4 root = Tk()
   5 canvas = Canvas(root, width=200, height=200)
   6 canvas.pack()
   7 canvas.bind("a", on_a)# bind - связывание события с обработчиком этого события, т.е. когда мы нажимаем а, заданная в начале функция вызывается.
   8 root.mainloop()

Полезные добавления к этому:

  1. <1> первая кнопка мыши,

  2. <4>, <5> - реакция на прокрутку,

  3. <Motion>- мышка двигается,

  4. <Shift-a>

  5. <B1-a>

  6. <B1-Motion>

  7. Координаты курсора:
    • ev (прописывается в скобочках, когда задаем функцию lalala(ev)),

    • ev.x,

    • ev.y