Можно рисовать сразу при создании окна, как мы это делали. Не самое лучшее решение. Усложним программу еще немного, чтобы потом было проще: создадим функцию, которую будем вызывать по нажатию кнопки «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 — три ошибки. Точно не меньше :)