Kodomo

Пользователь

Классы и снова объекты

Еще немного про интерфейсы

Для того чтобы указать где поместить элемент внутри виджета есть Geometry Manager . В Tkinter есть три типа Geometry manager: place, pack, grid. Чаще всего используется pack (собственно, про другие мы ничего пока не знаем).

   1 import Tkinter
   2 root=Tkinter.Tk()
   3 root.mainloop()
   4 hello=Tkinter.Button(root, text="Hello") #создаем объект из класса Button
   5 hello.pack()                             # Отображаем кнопку с помощью pack
   6 root.mainloop()

fill

fill – как и переводится, заполнить. fill заполняет либо объект цветом, либо растягивает виджет до полного заполнения родительского пространства:

   1 import tkinter
   2 root=tkinter.Tk()
   3 canv = tkinter.Canvas(root, width=500,height=500,bg="lightblue", cursor="pencil")
   4 canv.pack() 
   5 canv.create_line(200,50,300,50,width=3,fill="blue") # здесь fill заполняет синим созданную линию.
   6 canv.create_line(0,0,100,100,width=2) 
   7 root.mainloop()

А здесь 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 расширяет виджет в соответствии с родителем (растягивание последнего ведет к растягиванию самого виджета)

Ряд Фибоначи

   1 def fib(n):
   2         a= 1
   3         b= 1
   4         for i in range(n-1):
   5                 new_b = a+b
   6                 a=b
   7                 b=new_b
   8         return b
   9 
  10 fib(10)
  11 89

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()

   1 from tkinter import Tk, Button, Canvas, Frame
   2 root = Tk()
   3 canvas = Canvas(root, width=199, height=199, background="black")
   4 canvas.pack(fill="both", expand="yes")
   5 ok=Button(root,text = "ok")
   6 ok.pack(fill="x", expand="no")
   7 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:

   1 import tkinter 
   2 root = tkinter.Tk()
   3 def f():
   4     print ("Hello")
   5     root.after(1000,f)
   6 root.after(100,f)
   7 root.mainloop()

Классы

Помимо стандартных (списки, числа и т.д.) в питоне можно и самому создавать объекты с каким-либо набором переменных (для этого и нужны классы), которые тоже придумываем мы. Эти переменные называют атрибутами, а функцию внутри объекта – методом. Объект это отдельный представитель класса, класс же в свою очередь – описание принадлежащих объектам методов. Для создание в классе новых объектов класс вызывают как функцию(конструктор класса). Для примера опишем класс Planet, методов для этого класса нет, а атрубуты( радиус, расстояние до солнца и т.д.) есть.

   1 >>> class Planet(object):
   2       pass
   3 
   4 >>> earth=Planet()         # так создаются объекты из класса (класс вызывается как функция)
   5 >>> earth.r=6371.0         # точка позволяет обратится к атрибуту объекта earth класса Planet
   6 >>> sun=Planet()
   7 >>> sun.r=695500.0

Пример -- 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_ , принимает все аргументы из конструктора класса. Это упрощает заполнение атрибутов объектов класса.

Наследование

Наследование для классов – это наследование всех свойств класса потомка от родителя, а так же наследование объектом свойств класса .

   1 class Y(object):   # заметьте, все классы по сути являются, в той или иной степени, потомками класса object.
   2     pass
   3 
   4 class X(Y):
   5     pass
   6 
   7 x = X()

Мы создали объект x из класса Х и он является потомком класса Y, тогда когда мы спросим у питона что-нибудь про x.y, питон сначала начнет искать у внутри самого объекта x, потом внутри класса X, потом внутри родителя Х.