32
Екі Listbox тізімінен тұратын бағдарламаны жазыңыз.
Біріншісінде, мысалы,
бағдарламалық түрде берілген тауарлар тізімі болады. Екіншісі, бастапқысы бос болатын,
сатып алу тізімі болсын. Бір батырманы басқан кезде өнім бір тізімнен екіншісіне ауысуы
керек. Екінші батырманы басқан кезде, артқа қайту керек (адам сатып алу туралы ойын
өзгертті). Тізім элементтерінен бірнеше таңдау жасауды
және оларды ауыстыру
мүмкіндігін қамтамасыз етіңіз.
Сабақ 7. Bind әдісі
Tkinter-де bind әдісін арқылы виджет, оқиға және әрекет өзара байланыста болады.
Мысалы, виджет – батырма, оқиға – оны тінтуірдің сол жақ батырмасымен нұқыңыз, әрекет
– хабарлама жіберу. Тағы бір мысал: виджет – мәтін өрісі, оқиға –
Enter пернесін басу,
33
әрекет – бағдарламаны кейіннен өңдеу үшін get әдісімен өрістен мәтін алу. Әрекет оқиға
басталған кезде шақырылатын
функция немесе әдіс ретінде жасалады.
Бір виджетті бірнеше оқиғалармен байланыстыруға болады. Төмендегі мысалда бір
өңдеуші функциясы пайдаланылады, бірақ әртүрлі болуы мүмкін:
from tkinter import *
root = Tk()
def change(event):
b['fg'] = "red"
b['activeforeground'] = "red"
b = Button(text='RED', width=10, height=3)
b.bind('
', change)
b.bind('', change)
b.pack()
root.mainloop()
Мұнда батырмадағы мәтіннің түсі оны басқан кезде де өзгереді (оқиға ) және
Enter пернесін басқан кезде (оқиға ). Алайда, батырма фокусты алдын-ала алған
жағдайда ғана Enter жұмыс істейді. Бұл жағдайда Tab пернесін бір рет басу керек. Әйтпесе,
Enter пернесін басу батырмаға емес, терезеге қатысты болады.
Command қасиеті арқылы емес, bind арқылы шақырылатын өңдеуші функцияларда
оқиғалар берілетін event параметрі міндетті түрде болуы керек.
Event атауы-келісім, идентификаторда басқа атау болуы мүмкін, бірақ функцияда
бірінші орында тұруы керек немесе әдіс бойынша екінші болуы мүмкін:
from tkinter import *
root = Tk()
class RedButton:
def __init__(self):
self.b = Button(text='RED', width=10, height=3)
self.b.bind('', self.change)
34
self.b.pack()
def change(self, event):
self.b['fg'] = "red"
self.b['activeforeground'] = "red"
RedButton()
root.mainloop()
Функцияға қосымша аргумент беру қажет болса не істеу керек? Мысалы,
белгіні
тінтуірдің сол жақ батырмасымен нұқу оған бір қаріпті, ал тінтуірдің оң жақ батырмасымен
басқасын орнатады. Сіз екі түрлі
функцияны жаза аласыз:
from tkinter import *
root = Tk()
def font1(event):
l['font'] = "Verdana"
def font2(event):
l['font'] = "Times"
l = Label(text="Hello World")
l.bind('
', font1) # ЛКМ
l.bind('', font2) # ПКМ
l.pack()
root.mainloop()
Бірақ бұл дұрыс емес, өйткені функциялардың дене коды іс жүзінде бірдей және шрифт
атауын аргумент ретінде беруге болады. Одан да бір функцияны анықтаған дұрыс:
…
def changeFont(event, font):
l['font'] = font
…
Алайда, bind әдісіне функцияның қосымша аргументін қалай жеткізуге болады ?
Шынында да, біз бұл әдіске объект-функцияны береміз, бірақ оны шақырмаймыз. Сіз
L.bind('', changeFont(event, "Verdana") жаза алмайсыз. Сіз функцияның атауынан
кейін жақшаны қойғаннан кейін, ол оны шақырады, яғни дененің функциясын орындауға
міндетті болады. Егер функцияда return операторы болмаса, ол None мәнін қайтарады.
Демек, аргументтерді дұрыс өткізсеңіз де, байланыстыру әдісі функция объектісін емес,
None мәнін алады.
Lambda нұсқаулығымен жасалған Python функциясының анонимді объектілері көмекке
келеді . Біздің бағдарламаға қатысты ол келесідей болады:
l.bind('',
lambda e, f="Verdana": changeFont(e, f))
l.bind('',
lambda e, f="Times": changeFont(e, f))
35
Ламбда функцияларын тек bind әдісімен ғана емес,
сонымен қатар бірқатар
виджеттерде қол жетімді command опциясымен де қолдануға болады. Егер функция
command арқылы берілсе, оған event параметрі қажет емес. Мұнда виджет үшін
тек бір
негізгі оқиға өңделеді – тінтуірдің сол жақ батырмасымен шерту.
Белгілерде command жоқ, бірақ батырмаларда бұл қасиет бар:
from tkinter import *
def changeFont(font):
l['font'] = font
root = Tk()
l = Label(text="Hello World")
l.pack()
Button(command=
lambda f="Verdana": changeFont(f))\
.pack()
Button(command=
lambda f="Times": changeFont(f))\
.pack()
root.mainloop()
Достарыңызбен бөлісу: