ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.02.2024
Просмотров: 26
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Tkinter
Python-д а GUI бағдарламалау
"Tkinter. Python-да GUI бағдарламалау " курсы Python бағдарламалау тілінің tkinter пакетін қолдана отырып, пайдаланушының графикалық интерфейсін құру ерекшеліктерімен таныстырады. Python тілін құрылымдық бағдарламалау деңгейінде білуді қажет етеді, сонымен қатар OББ негіздерін білу қажет.
Бұл курста негізгі интерфейс элементтерімен (виджеттермен) жұмыс істеуге назар аударылады. Батырмалардың, тегтердің, мәтіндік өрістердің, тізімдердің, құсбелгілер мен радио батырмалардың, мәзірлердің негізгі қасиеттері мен әдістері зерттеледі.
Мұнда виджеттерді терезеге орналастырудың әртүрлі тәсілдері қарастырылады: қарапайым құрастыру, координаттар көмегімен кестелер жасау, бағдарламаның негізгі терезесінің параметрлері, сондай-ақ диалогтық терезелері зерттеледі.
Курс 16 сабақтан тұрады: Беті Практикалық
жұмыс шешімдері беті
1Tkinter дегеніміз не? 3 73
2 Button, Label, Entry виджеттері 9 77
3 Pack әдісі 13 80
4 Text - көп жолды мәтін өрісі 18 82
5 Radiobutton және Checkbutton. Tkinter айнымалылары 23 84
6 ListBox виджеті 29 86
7 Bind әдісі 32 87
8 Оқиғалар 35 88
9 Canvas 40 90
10 Canvas. Идентификаторлар, тегтер және анимация 44 91
11 Терезелер 48 93
12 Grid әдісі 52 95
13 Диалогты терезе 56 97
14 Menu виджеті 60 99
15 Place әдісі 64 101
16 Tkinter.ttk модульі 67 102
Сабақ 1. Tkinter дегеніміз не?
Tkinter - бұл Tk кітапханасымен жұмыс істеуге арналған Python пакеті. Tk кітапхансының құрамында пайдаланушының графикалық интерфейсінің компоненттері бар (graphical user interface – GUI). Бұл кітапхана Tcl бағдарламалау тілінде жазылған.
Пайдаланушының графикалық интерфейсі (GUI) дегеніміз- қосымшаның экранындағы барлық терезелер, батырмалар, мәтіндік өрістер, скроллерлер, тізімдер, радио батырмалар, құсбелгілер және басқалар. Олар арқылы сіз бағдарламамен әрекетте боласыз және оны басқарасыз. Осы интерфейстің барлық элементтері виджеттер (widgets) деп аталады.
Қазіргі уақытта соңғы пайдаланушы үшін жасалған барлық дерлік қосымшаларда GUI бар. Адаммен өзара әрекеттесуді білдіретін сирек бағдарламалар консоль болып қала береді. Алдыңғы екі курста біз тек консольдік бағдарламалар жаздық.
GUI –дің көптеген кітапханалары бар, олардың ішіндегі Tkinter құралы ең танымалысы емес, бірақ оны пайдаланып жасалынатын жобалар аз емес. Дегенмен, кейбір себептер бойынша ол әдепкі Python үшін таңдалды. Питонның орнату файлы әдетте басқа модульдермен қатар стандартты кітапхана құрамында tkinter пакетін қамтиды.
Tkinter-ді Python-нан Tcl-ге аудармашы ретінде сипаттауға болады. Сіз Python тілінде бағдарлама жазсаңыз, tkinter модулінің коды сіздің нұсқауларыңызды Tk кітапханасы түсінетін Tcl тіліне аударады.
Tkinter – оқиғаға-бағытталған пайдаланушының графикалық интерфейсі бар қосымша. Сіз құрылымдық және объектіге бағытталған бағдарламалау туралы түсінікке ие болуыңыз керек. Оқиғаға бағытталған бағдарламалау оқиғаға бағытталады. Яғни, бағдарламалық кодтың осы немесе басқа бөлігі белгілі бір оқиға болған кезде ғана орындала бастайды.
Оқиғаға бағытталған бағдарламалау объектіге бағытталған және құрылымдық негізделген. Біз өз кластарымыз бен объектілерімізді құрмасақ та, біз оларды қолданамыз. Барлық виджеттер - бұл кіріктірілген кластар жасаған объектілер болып саналады.
Оқиғалар әртүрлі. Мысалы, уақытша фактор жұмыс істейді, біреу тінтуірді шертеді немесе Enter батырмасын басады, мәтінді енгізе бастайды, радио батырмаларын ауыстырады, бетті төменге айналдырады және т.б. Осындай жағдай болған кезде, егер тиісті өңдегіш құрылған болса, бағдарламаның белгілі бір бөлігі іске қосылады, бұл қандай да бір нәтижеге әкеледі.
Tkinter Python модулі үшін келесі жолдардың кез келгенімен импортталады:
• import tkinter
• from tkinter import *
• import tkinter as tk
Жеке кластарды импорттауға болады, бұл сирек жасалады. Бұл курста біз from tkinter import * операторын қолданамыз. Қажет болса, TkVersion тұрақтысы арқылы Tk орнатылған нұсқасын білуге болады:
>>> from tkinter import *
>>> TkVersion
8.6
GUI бағдарламасын жазу үшін келесі әрекеттерді орындау керек:
1. Басты терезені жасау.
2. Виджеттер жасау және олардың қасиеттерін (опцияларын) енгізу.
3. Оқиғаны анықтау, яғни бағдарлама неге жауап береді.
4. Оқиға өңдеушілерін анықтау, яғни бағдарлама қалай жауап береді.
5. Виджеттерді басты терезеде орналастыру.
6. Оқиғаны өңдеу циклін іске қосу.
Бірізділік міндетті емес, бірақ бірінші және соңғы тармақтар әрқашан өз орындарында қалады. Мұның бәрін іс жүзінде көрейік.
Қазіргі заманғы операциялық жүйелерде кез-келген қолданушы қосымшасы негізгі деп атауға болатын терезеде орналасқан, өйткені онда барлық басқа виджеттер орналасқан. Жоғарғы деңгейлі терезе объектісі tkinter модулінің Tk класынан жасалады. Объектіге байланысты айнымалы көбінесе root (түбір) деп аталады:
root = Tk()
Бағдарлама терезесінде мәтін өрісі, белгі және батырма болсын. Бұл объектілер tkinter модулінің Entry, Label және Button кластарынан жасалған. Осы кластардың конструкторларына аргументтерді беру арқылы олардың кейбір қасиеттерін бірден конфигурациялаймыз:
ent = Entry(root, width=20)
but = Button(root, text="Преобразовать")
lab = Label(root, width=20, bg='black', fg='white')
Объектілерді құру кезінде олардың қасиеттерін орнату қажет емес. Оны одан кейін де істеудің бірнеше жолы бар.
Виджет конструкторына бірінші аргумент ретінде басты виджет жіберіледі, яғни жасалған виджет орналасатын болады. GUI элементтерін түбірді көрсетпей ақ тікелей негізгі терезеге орналастыруға болады. Яғни, біздің мысалда біз түбірді (root) жоя аламыз:
ent = Entry(width=20)
but = Button(text="Преобразовать")
lab = Label(width=20, bg='black', fg='white')
Дегенмен, виджеттер міндетті түрде root-та орналаспайды. Олар басқа виджеттерде орналасуы мүмкін, ол кезде «шеберді» көрсету қажет болады.
Бағдарламада өріске пайдаланушы енгізген мәтін өрісін басқан кезде сөздер тізіміне бөлініп, сөздер алфавит бойынша сұрыпталып, белгіде көрсетіледі делік. Мұның бәрін жасайтын код функцияға орналастырылуы керек:
def str_to_sort_list(event):
s = ent.get()
s = s.split()
s.sort()
lab['text'] = ' '.join(s)
Bind әдісін қолдана отырып, оқиға басталған кезде шақырылған функциялардың бір параметрі болуы керек. Ол әдетте
event деп аталады, яғни "оқиға".
Функцияда get әдісі арқылы мәтін жол болып табылатын өрістен алынады. Ол split әдісінің көмегімен сөздер тізіміне айналады. Содан кейін тізім сұрыпталады. Соңында text таңбасының қасиеті өзгереді. Оған join жолдық әдісінің көмегімен тізімнен алынған жол беріледі.
Енді функция шақыруын оқиғамен байланыстыру керек:
but.bind('
Бұл жағдайда bind әдісі арқылы жасалады. Оған оқиға мен функция- өңдеуші беріледі. Оқиға функцияға беріліп, event параметріне тағайындалады. Мұнда оқиға тінтуірдің сол жақ батырмасымен шерткендегі "
Кез-келген қосымшада виджеттер терезе бойымен біркелкі ұйымдастырылған, интерфейс егжей-тегжейлі ойластырылған және әдетте белгілі бір стандарттарға бағынады. Әзірге қарапайым tkinter-дің геометрия менеджері - pack әдісі арқылы элементтерді бірінің астына орналастырыңыз:
ent.pack()
but.pack()
lab.pack()
Tk данасының mainloop әдісі оқиғаларды өңдеудің негізгі циклын бастайды, соның ішінде “жинақталған” басты терезе виджеттерін көрсетуге әкеледі:
root.mainloop()
Бағдарламаның толық коды:
from tkinter import *
def str_to_sort_list(event):
s = ent.get()
s = s.split()
s.sort()
lab['text'] = ' '.join(s)
root = Tk()
ent = Entry(width=20)
but = Button(text="Преобразовать")
lab = Label(width=20, bg='black', fg='white')
but.bind('
ent.pack()
but.pack()
lab.pack()
root.mainloop()
Осы скрипты орындау нәтижесінде мәтін өрісіне сөздердің тізімін енгізіп, батырманы басып, оның сұрыпталған нұсқасын алуға болатын терезе пайда болады:
Енді біздің бағдарламада объектіге бағытталған тәсілді қолдануға тырысайық. Бұл міндетті емес, бірақ ыңғайлы. Белгіден, батырмадан және өрістен тұратын топ Block класынан пайда болатын бір объект болсын. Сонда бағдарламаның негізгі тармағында негізгі терезе, Block түріндегі объект және терезені іске қосу болады. Блок негізгі терезеге қосылуы керек болғандықтан, бастапқы терезені класс конструкторына жіберу тиімді.
from tkinter import *
root = Tk()
first_block = Block(root)
root.mainloop()
Енді Block класын жазайық:
class Block:
def __init__(self, master):
self.ent = Entry(master, width=20)
self.but = Button(master,
text="Преобразовать")
self.lab = Label(master, width=20,
bg='black', fg='white')
self.but['command'] = self.str_to_sort
self.ent.pack()
self.but.pack()
self.lab.pack()
def str_to_sort(self):
s = self.ent.get()
s = s.split()
s.sort()
self.lab['text'] = ' '.join(s)
Мұнда виджеттер Block түріндегі объект өрістерінің мәндері болып табылады, батырманы басу оқиғасын өңдеу функциясы bind әдісінің көмегімен емес, command қасиетін пайдаланып орнатылады. Бұл жағдайда шақырылатын функцияда event параметрі қажет емес. Біз әдіске объектінің өзін ғана береміз.
Дегенмен, егер код осылай көрінсе, онда кластың қажеті жоқ. Егер бізге бірнеше немесе көптеген ұқсас блок объектілері қажет болса, онда оның мағынасы пайда болады. Бізге белгіден, батырмадан, өрістен тұратын бірнеше блоктар қажет делік. Сонымен қатар, әр топтың батырмасында шертпенің өзіндік өңдеу функциясы болады.
Сонда command қасиеті үшін мәндерді конструкторға жіберуге болады. Мән оқиғаның өңдеу функциясымен байланысады. Бағдарламаның толық коды:
from tkinter import *
class Block:
def __init__(self, master, func):
self.ent = Entry(master, width=20)
self.but = Button(master, text="Преобразовать")
self.lab = Label(master, width=20, bg='black', fg='white')
self.but['command'] = getattr(self, func)
self.ent.pack()
self.but.pack()
self.lab.pack()
def str_to_sort(self):
s = self.ent.get()
s = s.split()
s.sort()
self.lab['text'] = ' '.join(s)
def str_reverse(self):
s = self.ent.get()
s = s.split()
s.reverse()
self.lab['text'] = ' '.join(s)
root = Tk()
first_block = Block(root, 'str_to_sort')
second_block = Block(root, 'str_reverse')
root.mainloop()
Func орнына 'str_to_sort' немесе 'str_reverse' жолы ауыстырылатын self.str_to_sort немесе self.str_reverse өрнегіне түрлендірілетін getattr(self, func) өрнегі.
Бұл кодты орындау кезінде терезеде біртипті екі блок пайда болады, олардың батырмалары әртүрлі әрекеттерді орындайды.
Егер сіз виджеттердің қасиеттерін қатаң орнатпасаңыз, бірақ мәндерді конструкторға аргумент ретінде берсеңіз, содан кейін объектілерді құру кезінде оларды тиісті опцияларға тағайындасаңыз, класты икемді етуге болады.
Практикалық жұмыс
Пайдаланушы сандарды енгізетін екі мәтіндік өрістен және «+», «-», «*», «/» төрт батырмаларынан тұратын қарапайым калькуляторды жазыңыз. Есептеу нәтижесі белгіде көрсетілуі керек. Егер арифметикалық әрекетті орындау мүмкін болмаса (мысалы, сандар емес, әріптер енгізілген болса), онда белгіде "қате" сөзі пайда болуы керек.
Сабақ 2. Button, Label, Entry виджеттері
Бұл оқулықта біз ең қарапайым және ең танымал GUI виджеттерінің үшеуін - батырманы, белгіні және бір жолды мәтін өрісін егжей-тегжейлі қарастырамыз. Tkinter-де осы интерфейс элементтерінің объектілері сәйкесінше Button, Label және Entry кластарынан жасалады.
Виджеттердің қасиеттері мен әдістері салыстырмалы түрде жалпы, көптеген түрлерге тән, сонымен қатар жеке, көбінесе тек бір класта кездесетін болады. Қалай болғанда да, бапталған қасиеттердің тізімі үлкен. Бұл курста біз тек tkinter пакеттік кластарының негізгі қасиеттері мен әдістерін қарастырамыз .
Tkinter бағдарламасында виджет қасиеттерін конфигурациялаудың үш жолы бар:
• объект жасау сәтінде,
• config әдісін пайдалану, яғни configure,
• сөздіктің элементі ретінде қасиетке жүгіну арқылы.
Button – батырмасы
Button класы виджетінің ең маңызды қасиеттері text, оның көмегімен батырмадағы жазба орнатылады және command, оның көмегімен әрекеттер орнатылады, яғни батырманы басқан кездегі орындалатын әрекет.
Әдепкі бойынша, батырма мәтіннің ені мен биіктігіне сәйкес өлшемде болады, бірақ бұл параметрлерді width мен height сипаттарын пайдаланып өзгертуге де болады. Яғни, бұл жағдайда өлшем бірліктері қолданылады.
bg, fg, activebackground және activeforground сияқты сипаттар сәйкесінше фон мен мәтін түсін, тінтуір басылғанда және меңзерді батырманың үстіне қойғандағы фон мен мәтін түсін анықтайды.
from tkinter import *
def change():
b1['text'] = "Изменено"
b1['bg'] = '#000000'
b1['activebackground'] = '#555555'
b1['fg'] = '#ffffff'
b1['activeforeground'] = '#ffffff'
root = Tk()
b1 = Button(text="Изменить",
width=15, height=3)
b1.config(command=change)
b1.pack()
root.mainloop()
Мұнда command қасиеті config әдісі арқылы орнатылады. Бірақ былай жасауға да болады: b1['command'] = change. Бағдарламаны іске қосқаннан кейін және оны басқаннан кейін батырма келесідей болады:
1 2 3 4
Label – белгі
Label виджеті жай ғана мәтінді терезеде көрсетеді және негізінен ақпараттық мақсаттарға қызмет етеді (хабарларды көрсету, басқа интерфейс элементтеріне қол қою). Белгінің қасиеттері батырманың қасиеттеріне өте ұқсас. Дегенмен, белгілерде command опциясы жоқ. Сондықтан оларды тек bind әдісі арқылы оқиғаға байланыстыра аласыз. Мысал ретінде Label объектісін пайдаланып font-шрифт қасиетін қарастырайық.
from tkinter import *
root = Tk()
l1 = Label(text="Машинное обучение",
font="Arial 32")
l2 = Label(text="Распознавание образов",
font=("Comic Sans MS",
24, "bold"))
l1.config(bd=20, bg='#ffaaaa')
l2.config(bd=20, bg='#aaffff')
l1.pack()
l2.pack()
root.mainloop()
Қаріп мәнін жол немесе кортеж ретінде беруге болады. Егер қаріп атауы екі немесе одан да көп сөзден тұратын болса, екінші нұсқа қолайлы. Қаріп атауынан кейін өлшемі мен стилін көрсетуге болады. Сондай-ақ, font ретінде bd қасиеті тек белгіде ғана емес. Оның көмегімен шекара өлшемі реттеледі (өлшем бірлігі – пиксель):
Белгілер мен батырмалар айнымалыларға тағайындалмайтын жағдайлар болады, егер кейін кодта оларға жүгінуді қажет етпесе. Олар кластан құрылады және бірден орналастырылады:
from tkinter import *
def take():
lab['text'] = "Выдано"
root = Tk()
Label(text="Пункт выдачи").pack()
Button(text="Взять", command=take).pack()
lab = Label(width=10, height=1)
lab.pack()
root.mainloop()
Бұл мысалда тек бір белгінің айнымалымен байланысы бар, өйткені оның қасиеттерінің бірі бағдарламаны орындау кезінде өзгертілуі мүмкін.
Entry – бір жолды мәтін өрісі.
Мәтін өрістері пайдаланушының ақпаратты енгізуіне және шығаруына арналған. Графикалық интерфейстің элементтері ретінде мәтіндік өрістер бір жолды және көп жолды болуы мүмкін. Tkinter-де екіншісіне Text класы сәйкес келеді, бірақ оған кейінірек тоқталамыз.
Entry даналарының қасиеттері алдыңғы екі виджетке ұқсас. Бірақ әдістері жоқ. Мәтін өрісінен мәтінді алуға болады. Бұл әрекет үшін get әдісі жауап береді. Мәтін өрісіне мәтінді insert әдісі арқылы енгізуге болады . Сондай-ақ, мәтінді delete арқылы жоюға болады .