Файл: Tkinter Pythonд а gui бадарламалау.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 27

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.




from tkinter import *
class CheckButton:

def __init__(self, master, title):

self.var = BooleanVar()

self.var.set(0)

self.title = title

self.cb = Checkbutton(

master, text=title, variable=self.var,

onvalue=1, offvalue=0)

self.cb.pack(side=LEFT)

def ch_on():

for ch in checks:

ch.cb.select()
def ch_off():

for ch in checks:

ch.cb.deselect()
root = Tk()
f1 = Frame()

f1.pack(padx=10, pady=10)

checks = []

for i in range(10):

checks.append(CheckButton(f1, i))

f2 = Frame()

f2.pack()

button_on = Button(f2, text="Все ВКЛ",

command=ch_on)

button_on.pack(side=LEFT)

button_off = Button(f2, text="Все ВЫКЛ",

command=ch_off)

button_off.pack(side=LEFT)
root.mainloop()




Практикалық жұмыс
Radiobatton және Checkbutton виджеттері басқа GUI элементтеріндегі сыртқы көрініс сипаттарының көпшілігін қолдайды. Сонымен қатар, бұл жағдайда Radiobutton - да indicatoron ерекше қасиеті бар. Әдепкі бойынша, ол бірлікке тең, бұл жағдайда радио батырма қалыпты радио батырмасы сияқты көрінеді. Алайда, егер сіз осы опцияны нөлге қойсаңыз, Radiobutton виджеттері сыртқы көріністегі кәдімгі батырмаға ұқсап қалады. Бірақ мағынасы бойынша емес.
Индикаторы өшірілген топқа біріктірілген бірнеше радио батырмалары бар бағдарламаны жазыңыз (indicatoron=0). Егер қандай да бір батырма қосылса, онда тиісті ақпарат белгіде көрсетілуі керек. Терезеде жай батырмалар болмауы керек.



Сommand қасиеті тек Button класының виджеттерінде ғана емес екенін ұмытпаңыз.

Сабақ 6. Listbox виджеті
Listbox классынан - виджеттер, олардың ішінде бағанда элементтер тізімделетін тізімдер жасалады. Бұл жағдайда тізімнен бір немесе бірнеше элементтерді таңдауға болады.
Tkinter-де алдымен Listbox экземпляры жасалады , содан кейін ол insert әдісімен толтырылады .


Insert-тегі бірінші аргумент ретінде элемент енгізілетін орын индексі беріледі. Егер тізімнің соңына енгізу қажет болса, онда индекс end тұрақты мәнімен белгіленеді . Екінші аргумент енгізілген элементті береді.
Әдепкі бойынша, Listbox-та тінтуірді басу арқылы тек бір элементті таңдауға болады. Егер бірнеше таңдауды қамтамасыз ету қажет болса, онда selectmode қасиеті үшін EXTENDED мәнін орнатуға болады. Бұл режимде сіз Ctrl немесе Shift пернелерін басып, қалаған элементтерді таңдай аласыз.

Егер ListBox үшін скроллер қажет болса, онда ол мәтін өрісі үшін де реттеледі. Бағдарламаға Scrollbar виджеті қосылып, Listbox экземплярымен байланысады.

Егер сіз екі индексті көрсетсеңіз, тізімнен get әдісін қолдана отырып, индекс бойынша бір элементті немесе кесуді алуға болады. Delete әдісі бір элементті немесе кесуді жояды.
Curselection әдісі ListBox экземплярының таңдалған элементтерінің индекстерін кортеж түрінде алуға мүмкіндік береді.
Төменде Listbox классының get, insert, delete және curselection әдістерін пайдалануды суреттейтін бағдарлама үлгісі берілген. Бірінші батырма мәтін өрісіне пайдаланушы енгізген жолды тізімге қосады, екінші батырма тізімнен таңдалған элементтерді жояды, үшінші батырма тізімді файлға сақтайды.


from tkinter import *
def add_item():

box.insert(END, entry.get())

entry.delete(0, END)
def del_list():

select = list(box.curselection())

select.reverse()

for i in select:

box.delete(i)
def save_list():

f = open('list000.txt', 'w')

f.writelines("\n".join(box.get(0, END)))

f.close()
root = Tk()
box = Listbox(selectmode=EXTENDED)

box.pack(side=LEFT)

scroll = Scrollbar(command=box.yview)

scroll.pack(side=LEFT, fill=Y)

box.config(yscrollcommand=scroll.set)
f = Frame()

f.pack(side=LEFT, padx=10)

entry = Entry(f)

entry.pack(anchor=N)

Button(f, text="Add", command=add_item)\

.pack(fill=X)

Button(f, text="Delete", command=del_list)\

.pack(fill=X)

Button(f, text="Save", command=save_list)\

.pack(fill=X)
root.mainloop()



Del_list функциясында таңдалған элементтердің кортежі тізімге айналады, содан кейін ол кері ауыстырылады, яғни аударылады. Бұл элементтерді тізімдерді соңынан бастап жою үшін жасалады. Әйтпесе, бағдарлама дұрыс жұмыс істемейді, өйткені элементті жою одан кейінгі барлық индекстердің өзгеруіне әкеледі. Егер сіз соңынан жойсаңыз, онда алда тұрған индекстер өзгермейді.
Getselection әдісі кортежді қайтарады. Кортеждерде reverse әдісі жоқ, сондықтан біз оны тізімге айналдырамыз.
Save_list функциясында get әдісін қайтарған элемент жолдарының тізбегі '\n ' бөлгіш арқылы join жол әдісін қолдана отырып, бір жолға айналады. Бұл тізім элементтерін бағанға жазу үшін жасалады.
Listbox - бұл өте күрделі виджет. Қарастырылғандардан басқа, оның басқа әдістері, сондай-ақ көптеген қасиеттері бар.


Практикалық жұмыс
Екі Listbox тізімінен тұратын бағдарламаны жазыңыз. Біріншісінде, мысалы, бағдарламалық түрде берілген тауарлар тізімі болады. Екіншісі, бастапқысы бос болатын, сатып алу тізімі болсын. Бір батырманы басқан кезде өнім бір тізімнен екіншісіне ауысуы керек. Екінші батырманы басқан кезде, артқа қайту керек (адам сатып алу туралы ойын өзгертті). Тізім элементтерінен бірнеше таңдау жасауды және оларды ауыстыру мүмкіндігін қамтамасыз етіңіз.


Сабақ 7. Bind әдісі
Tkinter-де bind әдісін арқылы виджет, оқиға және әрекет өзара байланыста болады. Мысалы, виджет – батырма, оқиға – оны тінтуірдің сол жақ батырмасымен нұқыңыз, әрекет – хабарлама жіберу. Тағы бір мысал: виджет – мәтін өрісі, оқиға – Enter пернесін басу, әрекет – бағдарламаны кейіннен өңдеу үшін 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)

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



Ламбда функцияларын тек 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()



Практикалық жұмыс
Бағдарламаны келесі сипаттама бойынша жазыңыз. Бір жолды мәтін жолағында Enter пернесін басу мәтінді одан тізімге ауыстыруға әкеледі (Listbox экземпляры). Тізімнің элементі-жолында ( ) екі рет басқанда, ол мәтіндік өріске көшірілуі тиіс.

Сабақ 8. Оқиғалар
Әдетте, графикалық интерфейсі бар қосымшаның бірдеңе жасауы үшін белгілі бір оқиғалар орын алуы керек, көбінесе адамның GUI элементтеріне әсері.

Оқиғалардың үш негізгі түрін бөлуге болады: тінтуір шығаратын, пернетақтадағы пернелерді басу, сонымен қатар виджеттердің өзгеруі нәтижесінде пайда болатын оқиғалар. Комбинациялар жиі өңделеді. Мысалы, пернетақтадағы пернесі бар тінтуірді шерту.
Оқиғалар түрі



Bind әдісін шақырған кезде оқиға бірінші аргумент ретінде беріледі.



Оқиғаның атауы тырнақшада, сондай-ақ бұрыштық жақшаларда < және > болады. Оқиғалар сақталған кілттік сөздер арқылы сипатталады.
Жиі қолданылатын тінтуір арқылы орындалатын оқиғалар:




Мысалы:



from tkinter import *
def b1(event):

root.title("Левая кнопка мыши")
def b3(event):

root.title("Правая кнопка мыши")
def move(event):

x = event.x

y = event.y

s = "Движение мышью {}x{}".format(x, y)

root.title(s)
root = Tk()

root.minsize(width=500, height=400)
root.bind('', b1)

root.bind('', b3)

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 пернесін басуға қатысы жоқ оқиғасы бар екенін ескеріңіз, бірақ меңзер виджет шегіне жеткенде пайда болады.

Бағдарламаны қарастырайық:




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()
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 параметріне тағайындалады.


Практикалық жұмыс
Сипаттама бойынша бағдарлама жазыңыз. Көп жолды мәтін өрісінің өлшемдері бір жолды мәтін жолақтарына енгізілген мәндермен анықталады. Өлшемді өзгерту тінтуірмен батырманы басқанда, сонымен қатар Enter пернесін басқанда болады.

Text экземплярының фон түсі өріс фокусталмаған кезде ашық сұр (lightgrey) және фокусы бар кезде ақ болады. Фокусты арттыру оқиғасы , жоғалту оқиғалары ретінде белгіленеді.

Анықтама үшін: фокус Tab, Ctrl+Tab, Shift+Tab пернелерін басқан кезде, сондай-ақ оларды тінтуірмен басқан кезде виджеттер бойынша жылжиды (соңғысы батырмаларға қолданылмайды).
1   2   3   4