Можно рисовать сразу при создании окна, как мы это делали. Не самое лучшее решение. Усложним программу еще немного, чтобы потом было проще: создадим функцию, которую будем вызывать по нажатию кнопки «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, остальной код останется прежним.
<Button-1> ? (см. справочник событий)2. Что будет, если указать просто
<Button>?3. Что будет, если указать Button-1 без треугольных скобок?
4. Какова роль метода bind? Что он делает?
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()
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()
Обратите внимание, что в программе пункта 6 — три ошибки. Точно не меньше :)