Классы и снова объекты
Содержание
Еще немного про интерфейсы
Для того чтобы указать где поместить элемент внутри виджета есть Geometry Manager . В Tkinter есть три типа Geometry manager: place, pack, grid. Чаще всего используется pack (собственно, про другие мы ничего пока не знаем).
fill
fill – как и переводится, заполнить. fill заполняет либо объект цветом, либо растягивает виджет до полного заполнения родительского пространства:
А здесь fill растягивает кнопки по родительскому виджету
1 import tkinter
2 root=tkinter.Tk()
3 canvas=tkinter.Canvas(root, width=400,height=400)
4 canvas.pack(side="top", fill="both", expand="yes")
5 button=tkinter.Frame(root)
6 button.pack(fill="x")
7 a=tkinter.Button(button, text="A")
8 a.pack(side="left",fill="x",expand="yes")
9 b=tkinter.Button(button, text="B")
10 b.pack(side="right", fill="x", expand="yes")
11 root.mainloop()
Здесь side – указывает положение объекта (слева, снизу, справа, сверху, в центре) А expand расширяет виджет в соответствии с родителем (растягивание последнего ведет к растягиванию самого виджета)
Ряд Фибоначи
frame -- рамка
Рамка это"невидимый" виджет,позволяющий вместить в себя другие виджеты с использованием других Geometry Manager. (проводя ОЧЕНЬ поверхностную аналогию, можно сказать, что frame похож на <div> в html)))
1 from Tkinter import Tk, Button, Canvas, Frame
2 root = Tk()
3 canvas = Canvas(root, width=599, height=399, background="black")
4 canvas.pack()
5 button_up = Button(root,text = "w")
6 button_up.pack()
7 frame1 = Frame(root, width=500) # frame вмещает в себя кнопки
8 button_left=Button(frame1 , text ="a")
9 button_left.pack(side="left")
10 button_right=Button(frame1 , text ="d")
11 button_right.pack(side="right")
12 frame1.pack()
13 button_down=Button(root, text ="s")
14 button_down.pack()
15 root.mainloop()
entry и label
entry – поле ввода текста; label – "Этикетка", показывает изображение или текст.
1 import tkinter
2 root = tkinter.Tk()
3 canvas = tkinter.Canvas(root, width=199, height=199, background="white")
4 canvas.pack(side="top",fill="both", expand="yes")
5 top_row = tkinter.Frame(root)
6 top_row.pack(side="left")
7 label= tkinter.Label (top_row, text = "Name :")
8 label.pack(side="left")
9 entry = tkinter.Entry(top_row)
10 entry.pack(side="left")
11 entry.delete (1, "end")
12 entry.insert("end","hello")
13 root.mainloop()
after
Чтобы выполнить какое-либо действие с задержкой или после другого действия нужен after:
Классы
Помимо стандартных (списки, числа и т.д.) в питоне можно и самому создавать объекты с каким-либо набором переменных (для этого и нужны классы), которые тоже придумываем мы. Эти переменные называют атрибутами, а функцию внутри объекта – методом. Объект это отдельный представитель класса, класс же в свою очередь – описание принадлежащих объектам методов. Для создание в классе новых объектов класс вызывают как функцию(конструктор класса). Для примера опишем класс Planet, методов для этого класса нет, а атрубуты( радиус, расстояние до солнца и т.д.) есть.
Пример -- Vector
на этом примере покажем синтаксис класса:
1 >>> class Vector(object):
2 def __init__(self,x,y):
3 self.x=x
4 self.y=y
5 def __add__(self,other):
6 result=Vector(self.x+other.x,self.y+other.y)
7 return result
8 def __repr__(self):
9 return "Vector(%s,%s)"%(self.x,self.y)
10
11 >>> a=Vector(1,2)
12 >>> b=Vector(5,6)
13 >>> c=a+b
14 >>> print c
15 Vector(6,8)
Объект, на котором вызван метод, передается ему в качестве первого аргумента и традиционно называется self. Его можно назвать и по своему усмотрению, но в питоне тоже есть "правила хорошего тона" и общепринятым является self. Класс, имеющий метод _init_ , принимает все аргументы из конструктора класса. Это упрощает заполнение атрибутов объектов класса.
Наследование
Наследование для классов – это наследование всех свойств класса потомка от родителя, а так же наследование объектом свойств класса .
Мы создали объект x из класса Х и он является потомком класса Y, тогда когда мы спросим у питона что-нибудь про x.y, питон сначала начнет искать у внутри самого объекта x, потом внутри класса X, потом внутри родителя Х.