Пришла пора сменить графическую систему отображения. К Черепашке мы еще вернемся (с ее помощью удобно рисовать фракталы), а пока оставим ее и начнем рисовать в Tkinter. Tkinter – это один из способов создать «окошки и кнопки» на Python. Кроме Tkinter существуют и другие, самые известные: Qt, wxForms. Tkinter удобен тем, что он входит в стандартную поставку Python, а значит доступен всегда (почти всегда).
Недостаток – маловато возможностей для построения сложных систем. Но нам это совсем не помешает.
Создадим простую программу:
from tkinter import * root = Tk() mainloop()
Первая строка подключает модуль tkinter. Вторая строка – создает окно (главное и единственное). Третья – запускает цикл обработки событий (см. справочник: зачем нужен главный событийный цикл).
Немного изменим программу. Прежде, чем ее запустить, подумайте, что должно измениться?
from tkinter import * root = Tk() root.geometry('800x600') mainloop()
Создадим кнопку:
from tkinter import * root = Tk() root.geometry('800x600') bt1 = Button(root,width=8,text='Go!') mainloop()
Ошибок нет, но нет и кнопки! Причина в том, что создать кнопку мало – надо ее размесить на форме. За это отвечает метод pack() (см. справочник – параметры pack)
from tkinter import * root = Tk() root.geometry('800x600') bt1 = Button(root,width=8,text='Go!') bt1.pack() mainloop()
2. Создать две кнопки и прижать их к левой стороне окна
3. Создать две кнопки в верхней части окна. Кнопки расположить горизонтально (вторая справа от первой), в одной строке
На последней задаче остановимся подробнее: если просто написать
bt1.pack(side='left') bt2.pack(side='left')
То кнопки будут расположены горизонтально, но не в верхней части окна. Другой вариант:
bt1.pack(side='top') bt2.pack(side='top')
так же не дает нужного результата: кнопки в верхней части окна, но друг под другом.
Выход из этой ситуации есть и он заключается в использовании Frame. Мы создадим невидимый контейнер, в который поместим кнопки. Прижмем их к левому краю Frame, а сам контейнер – к верхней границе окна:
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') bt2.pack(side='left') fr.pack() mainloop()
Неплохо, но кнопки «слиплись». Это некрасиво. Исправим, использую padx и pady:
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) mainloop()
И снова будем рисовать. Для этого создадим Canvas
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) mainloop()
Проверим, можем ли мы рисовать?
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) canv.create_rectangle(30,50,120,80,fill='green') mainloop()
5. Нарисуйте квадрат примерно в центра окна, размером 100
+
+