Практикалық жұмыс Бағдарламаны келесі сипаттама бойынша жазыңыз. Бір жолды мәтін жолағында Enter
пернесін басу мәтінді одан тізімге ауыстыруға әкеледі (Listbox экземпляры). Тізімнің
элементі-жолында ( ) екі рет басқанда, ол мәтіндік өріске көшірілуі тиіс.
Сабақ 8. Оқиғалар Әдетте, графикалық интерфейсі бар қосымшаның бірдеңе жасауы үшін белгілі бір
оқиғалар орын алуы керек, көбінесе адамның GUI элементтеріне әсері.
36
Оқиғалардың үш негізгі түрін бөлуге болады: тінтуір шығаратын, пернетақтадағы
пернелерді басу, сонымен қатар виджеттердің өзгеруі нәтижесінде пайда болатын оқиғалар.
Комбинациялар жиі өңделеді. Мысалы, пернетақтадағы пернесі бар тінтуірді шерту.
Оқиғалар түрі Bind әдісін шақырған кезде оқиға бірінші аргумент ретінде беріледі.
Оқиғаның атауы тырнақшада, сондай-ақ бұрыштық жақшаларда < және > болады.
Оқиғалар сақталған кілттік сөздер арқылы сипатталады.
Жиі қолданылатын тінтуір арқылы орындалатын оқиғалар:
37
root.bind('', move)
root.mainloop()
Бұл бағдарламада тінтуірдің қозғалуына байланысты негізгі терезенің тақырыбындағы
жазба өзгереді, сол немесе оң жақ батырманы шертіңіз.
Оқиға (Event ) – tkinter объектілерінің бірі . Оқиғалардың көптеген басқа объектілер
сияқты атрибуттары бар. Move функциясындағы мысалда
event объектісінің х және y
атрибуттарының мәндері алынады, онда оқиға жасалған виджет ішінде тінтуір курсорының
орналасқан жерінің координаттары сақталады. Бұл жағдайда виджет-негізгі терезе, ал оқиға
– , яғни тінтуірдің қозғалысы.
Бағдарламада төменде Event данасы және оның кейбір қасиеттері туралы ақпарат
көрсетіледі. Барлық атрибуттарды dir(event) командасы арқылы көруге болады. Әр түрлі
оқиғаларда олар бірдей, тек мәндері өзгереді. Белгілі бір оқиғалар үшін атрибуттардың бір
бөлігінің мағынасы жоқ, мұндай қасиеттер әдепкі мәндерге ие.
Мысалда пернетақта пернесін басу оқиғасы өңделсе де, тінтуір курсорының
экранындағы ережелер координаттары x, y, x_root, y_root өрістерінде сақталады.
from tkinter import *
def event_info(event):
print(type(event))
print(event)
print(event.time)
print(event.x_root)
print(event.y_root)
root = Tk()
root.bind('a', event_info)
root.mainloop()
Бағдарламаның орындалу үлгісі:
8379853
37
92
Пернетақтадағы оқиғалар үшін әріптік пернелерді бұрыштық жақшаларсыз жазуға
болады (мысалы, 'a').
Альфавиттік емес пернелер үшін арнайы сақталған сөздер бар. Мысалы, -
Enter пернесін басу, - бос орын. Enter пернесін басуға қатысы жоқ оқиғасы
бар екенін ескеріңіз, бірақ меңзер виджет шегіне жеткенде пайда болады.
Бағдарламаны қарастырайық:
38
from tkinter import *
def enter_leave(event):
if event.type == '7':
event.widget['text'] = 'In'
elif event.type == '8':
event.widget['text'] = 'Out'
root = Tk()
lab1 = Label(width=20, height=3, bg='white')
lab1.pack()
lab1.bind('', enter_leave)
lab1.bind('', enter_leave)
lab2 = Label(width=20, height=3, bg='black',
fg='white')
lab2.pack()
lab2.bind('', enter_leave)
lab2.bind('', enter_leave)
root.mainloop()
Онда екі белгі бірдей функцияны қолданады және әр белгі осы функцияны екі түрлі
оқиғаны өңдеу үшін қолданады: меңзерді виджет шегіне енгізу және шекараларға шығару.
Функция оқиға қай виджетке бекітілгеніне байланысты тек осы виджеттің қасиеттерін
өзгертеді. Қалай өзгеретіні оқиғаға байланысты.
event.widget қасиеті оқиғаны жасаған виджетке сілтемені қамтиды. event.type қасиеті
қандай оқиға болғанын сипаттайды. Әр оқиғаның аты мен нөмірі бар. Print (repr (event.type))
өрнегі оның толық сипаттамасын көруге мүмкіндік береді. Бұл ретте бір платформаларда
str (event.type) оқиға атауын қайтарады (мысалы, 'Enter'), басқаларында – оқиға нөмірінің
жол көрінісін (мысалы, '7') қайтарады.
Пернетақта оқиғаларына оралатын болсақ. Пернелер тіркесімдері сызықша арқылы
жазылады. Егер модификатор қолданылатын жағдай болса, ол бірінші, бөлшектер үшінші
орында көрсетіледі. Мысалы, - Shift пернелері мен жоғары көрсеткілерді бір
уақытта басу, - Ctrl пернесі және сол жақ батырмасымен басылған
тінтуірдің қозғалысы.
from tkinter import *
def exit_win(event):
root.destroy()
39
def to_label(event):
t = ent.get()
lbl.configure(text=t)
def select_all(event):
def select_all2(widget):
widget.selection_range(0, END)
widget.icursor(END) # курсор в конец
root.after(10, select_all2, event.widget)
root = Tk()
ent = Entry(width=40)
ent.focus_set()
ent.pack()
lbl = Label(height=3, fg='orange',
bg='darkgreen', font="Verdana 24")
lbl.pack(fill=X)
ent.bind('', to_label)
ent.bind('', select_all)
root.bind('', exit_win)
root.mainloop()
Мұнда Ctrl+A пернелер тіркесімі өрістегі мәтінді ерекшелейді. root.after () параметрісіз
таңдау жұмыс істемейді. After әдісі екінші аргументте көрсетілген функцияны бірінші
аргументте көрсетілген уақыт аралығында орындайды. Үшінші дәлелде
event объектісінің
widget атрибутының мәні беріледі. Бұл жағдайда олар
ent өрісі болады. Ол
select_all2 функциясына аргумент ретінде жіберіледі және widget параметріне тағайындалады.