13
Сабақ 3. Pack әдісі
GUI виджеттерімен танысуды жалғастырмас бұрын, олардың терезеде орналасуы
мәселесіне тоқталайық. Бұл маңызды сұрақ, өйткені бағдарламаның ыңғайлылығы көбінесе
интерфейстің ойластырылғандығына байланысты. Кеңістікте
виджеттерді ұйымдастыру
арқылы бағдарламашы ішінара дизайнер, интерфейс әзірлеушісіне айналады.
Tkinter-де геометрия деп аталатын үш менеджер бар - жинақтаушы, тор және
координаттар бойынша орналастыру. Бұл сабақта ең қарапайым және жиі қолданылатыны
ретінде біріншісі қарастырылады, қалған екеуіне кейінірек тоқталамыз.
Жинақтаушы (packer) барлық виджет нысандарында
болатын pack әдісімен
шақырылады. Біз оны алдын пайдаландық. Интерфейс элементіне геометрия
менеджерлерінің ешқайсысын қолданбасаңыз, ол терезеде көрсетілмейді. Бұл ретте әртүрлі
басқарушыларды бір терезеде (немесе кез келген басқа түбірлік виджетте) біріктіру мүмкін
емес. Виджеттерді pack әдісі арқылы орналастыруды бастасаңыз, тор (grid)
мен орын
(place) әдістерін бірден қолдануға тырыспаңыз.
Егер сіз аргументтерді жинақтаушыға жібермесеңіз, онда виджеттер бір-бірінің үстіне
тігінен орналасады. Бірінші шақырылатын pack объекті жоғарғы жағында болады. Екіншісі-
біріншінің астында сияқты және т.б.
Pack әдісінің tkinter-дің төрт тұрақты мәнінің - TOP, BOTTOM , LEFT , RIGHT
(жоғарғы , төменгі, сол, оң) біреуін алатын side (тарап) параметрі бар.
Әдепкі бойынша,
pack-те side көрсетілмеген кезде, оның мәні TOP болады . Осыған байланысты виджеттер
тігінен орналастырылады.
Боялған төрт белгіні жасаңыз
…
l1 = Label(width=7, height=4, bg='yellow', text="1")
l2 = Label(width=7, height=4, bg='orange', text="2")
l3 = Label(width=7, height=4, bg='lightgreen', text="3")
l4 = Label(width=7, height=4, bg='lightblue', text="4")
…
және side мәндерінің әртүрлі комбинацияларын қарастырыңыз:
15
Соңғы екі нұсқаның
проблемасы-егер сіз виджеттерді квадратқа қоюыңыз керек болса,
яғни екі жоғарғы және екі жоғарғының астына тағы екеуін қою қажет болса, оны жасау
қиынға соғады. Сондықтан олар көмекші виджетке – frame
класынан пайда болатын
фреймге (жақтау) жүгінеді .
Жақтаулар негізгі терезеде, ал жақтауларда виджеттер орналастырылған:
from tkinter import *
root = Tk()
f_top = Frame(root)
f_bot = Frame(root)
l1 = Label(f_top, width=7, height=4,
bg='yellow', text="1")
l2 = Label(f_top, width=7, height=4,
bg='orange', text="2")
l3 = Label(f_bot, width=7, height=4,
bg='lightgreen', text="3")
l4 = Label(f_bot, width=7, height=4,
bg='lightblue', text="4")
f_top.pack()
f_bot.pack()
l1.pack(side=LEFT)
l2.pack(side=LEFT)
l3.pack(side=LEFT)
l4.pack(side=LEFT)
root.mainloop()
Нәтиже:
16
Frame-нен басқа оған ұқсас қолтаңбасы бар жақтау- LabelFrame класы бар. Қарапайым
жақтаудан айырмашылығы, оның text қасиеті бар .
…
f_top = LabelFrame(text="Верх")
f_bot = LabelFrame(text="Низ")
…
Side - тан басқа pack-те басқа -қасиеттер параметрі бар. Ішкі ( ipadx және ipady ) және
сыртқы (padx және pady ) шегіністерді орнатуға болады:
Ішкі шегіністер орнатылған кезде, бүйір жағы виджетті сол жақ жиекке
қысатындықтан, оң жақта 20
пиксельді шегініс аламыз, ал сол жақта ештеңе жоқ. Ішкі
жақтаудың шегіністерін белгінің сыртқы шегіністерімен ауыстыру арқылы мәселені
ішінара шешуге болады.
17
Бірақ содан кейін белгілердің арасында алшақтық пайда болады. Оны жою үшін әрбір
виджетті өз жақтауына салу керек болады. Бұдан біз Tkinter жиынтығы салыстырмалы
түрде қарапайым интерфейстер үшін ғана қолайлы деген қорытындыға келеміз.
Келесі екі қасиет- fill (толықтыру) және expand (кеңейту). Әдепкі бойынша, expand
нөлге тең (басқа мәні – бірлік), ал fill – NONE (басқа мәндері BOTH, X, Y).
Бір белгісі бар терезе жасаңыз:
from tkinter import *
root = Tk()
l1 = Label(text="This is a label",
width=30, height=10,
bg="lightgreen")
l1.pack()
root.mainloop()
Егер терезені кеңейте бастасақ немесе оны бүкіл экранға бірден ашатын болсақ, онда
белгі жоғарыда тігінен және ортасында көлденең орналасады.
Белгінің ортасында тік
болмауының себебі, side әдепкі бойынша TOP-қа тең және белгіні жоғарғы жағына бекітеді.
Егер сіз expand қасиетін 1-ге орнатсаңыз, онда терезені кеңейткен кезде белгі әрқашан
ортасында болады:
…
l1.pack(expand=1)
…
Fill қасиеті виджетке барлық қол жетімді кеңістікті толтыртады. Оны барлық бағытта
немесе осьтердің бірінде ғана толтыруға болады:
…
l1.pack(expand=1, fill=Y)
…
18
Pack әдісінің соңғы нұсқасы - anchor (зәкір) - N (north - солтүстік), S (south - оңтүстік),
W (west - батыс), E (east - шығыс) мәндерін және олардың комбинацияларын қабылдай
алады:
…
l1.pack(expand=1, anchor=SE)
…
Достарыңызбен бөлісу: