9. Жмем на кнопки. Возникают события. Обрабатываем! События Tkinter и их обработка.

Можно рисовать сразу при создании окна, как мы это делали. Не самое лучшее решение. Усложним программу еще немного, чтобы потом было проще: создадим функцию, которую будем вызывать по нажатию кнопки «1»: (см. справочник использование bind)

from tkinter import *
root = Tk()
root.geometry('800x600')
fr = Frame(root)
bt1 = Button(fr,width=8,text='1')
bt2 = Button(fr,width=8,text='2')
bt1.pack(side='left',padx=2)
bt2.pack(side='left',padx=2)
fr.pack(pady=5)
canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)

def paint(event):
    canv.create_rectangle(30,50,120,80,fill='green')

bt1.bind('<Button-1>',paint)
mainloop()

Запустите программу, нажмите на кнопку «1», чтобы нарисовать зеленый прямоугольник. Все работает, однако было сделано одно допущение, на которое следует обратить внимание: внутри функции paint не существует переменной canv, но мы можем к ней обратиться, потому что она есть в основной программе. Не всегда так получится сделать: (см. справочник – область видимости переменных).

Доработаем программу: добавим кнопку для очистки Canvas, а также изменим названия кнопок и надписи на них:

from tkinter import *
root = Tk()
root.geometry('800x600')
fr = Frame(root)
bt_paint = Button(fr,width=8,text='paint')
bt_clear = Button(fr,width=8,text='clear')

bt_paint.pack(side='left',padx=2)
bt_clear.pack(side='left',padx=2)

fr.pack(pady=5)
canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)

def clear(event):
    canv.delete(ALL)

def paint(event):
    canv.create_rectangle(30,50,120,80,fill='green')

bt_paint.bind('<Button-1>',paint)
bt_clear.bind('<Button-1>',clear)
mainloop()

При нажатии на paint – рисуется зеленый прямоугольник, при нажатии на clear – очищается Canvas (холст). В дальнейшем мы будем менять только содержимое функции paint, остальной код останется прежним.

1. Что означает <Button-1> ? (см. справочник событий)
2. Что будет, если указать просто <Button>?
3. Что будет, если указать Button-1 без треугольных скобок?
4. Какова роль метода bind? Что он делает?
5. Программист создал программу из примера, но допустил ошибки. Помогите ему разобраться и запустить программу:
from tkinter import *
root = Tk()
root.geometry('800x600')
fr = Frame(root)
bt_paint = Button(fr,width=8,text='paint')
bt_clear = Button(fr,width=8,text='clear')

bt_paint.pack(side='left',padx=2)
bt_clear.pack(side='left',padx=2)

fr.pack(pady=5)
canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)

def clear(event):
    canv.delete(ALL)

def paint(event):
    canv.create_rectangle(30,50,120,80,fill='green')

bt_paint.bind('<Button-1>',paint())
bt_clear.bind('<Button-1>',clear())
mainloop()

6. Нужно было сделать окно, в котором расположена одна кнопка, которая рисует красную окружность. Программа запускается, но не похоже, чтобы она что-то рисовала. Помогите найти и исправить одну ошибку:
from tkinter import *
root = Tk()
root.geometry('300x300')
bt_paint = Button(root,width=8,text='paint')
bt_paint.pack()
canv = Canvas(root,bg='white')
canv.pack
def paint(event):
    canv.create_rectangle(30,50,120,80,fill='green')
bt_paint.bind('<Button-1>',paint)

mainloop()

2 thoughts on “9. Жмем на кнопки. Возникают события. Обрабатываем! События Tkinter и их обработка.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *