73 PySimpleGUI nupuvajutus, hüpikaken ja uue graafikaakna avamine
Oleme nüüdseks tutvunud kasutajaliidese lihtsamate põhielementidega. Vaatame nüüd mõningaid võtteid, mille abil saab veelgi põnevamaid ja kasulikumaid programme teha!
Nupuvajutus ja arvutustehe
Vahel on kasutaja käest vaja küsida ka arve ning nendega näiteks mõni arvutustehe sooritada. Vaatame näidet, kus kasutajalt küsitakse mingi täisarv ning seejärel arvutatakse funktsiooni abiga selle ruut.
Esmalt impordime PySimpleGUI klassid ja funktsioonid, sätestame akna värviteema ning koostamegi funktsiooni, mis arvutustehte sooritab. Tuleta meelde, kuidas Pythonis astendamine käis!
import PySimpleGUI as sg sg.theme('Dark Blue 3') #funktsioon arvutustehte sooritamiseks def arvuta(arv): arvu_ruut = arv**2 return arvu_ruut
Seejärel paneme paika paigutuse juba tuttavate elementidega. Loome võtmed tekstisisestuskastile ja tekstisildile. Samuti loome akna sobiva pealkirja ja paigutusega, määrame ka selle suuruse.
paigutus = [[sg.Text('Mis on arvu ruut?', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-100:', size=(20, 1)), sg.Input(key='sisestatud_arv')], [sg.Submit('Arvuta!'), sg.Cancel('Sulge aken')], [sg.Text('_' * 30)], [sg.Text('Arvu ... ruut on ... ', size=(20,1), key='tekstisilt')]] aken = sg.Window('Arvutustehe', paigutus, size=(400,200))
Nüüd siseneme while-tsüklisse. Kui aken pannakse ristist kinni või kui vajutatakse ‘Sulge aken!’ nuppu, lõpetab programm töö.
while True: syndmus, v22rtused = aken.read() if syndmus == sg.WIN_CLOSED or syndmus == 'Sulge aken': break
Kui aga vajutati ‘Arvuta!’ nuppu, saame esmalt kätte sisendi. See on meil salvestatud sõnastikku ning sellele vastav võti on sisestatud_arv.
Jälgi kindlasti, et sisend tuleb (täis)arvuks teisendada, et arvutustehet sooritada int(…) – vastasel juhul saame veateate!
if syndmus == 'Arvuta!': sisend1 = int(v22rtused['sisestatud_arv'])
Nüüd kasutame ülal loodud funktsiooni, mis meie eest väga mugavalt vastuse leiab. Funktsiooni argumendiks määrame sisendi, mille just leidsime. Salvestame vastuse muutujasse vastus.
vastus = arvuta(sisend1)
Ja ongi aeg tekstisildile kuvada sisestatud arvu ja tehte vastuse! Siin peame tegema vastupidise teisenduse – arvud tuleb teha sõnedeks, et neid tekstina aknas kuvada str(…).
aken['tekstisilt'].update('Arvu ' + str(sisend1) + ' ruut on ' + str(vastus)) aken['sisestatud_arv'].update('')
Ära unusta, et lõpus tuleb aken sulgeda!
aken.close()
Ja programm ongi valmis!
Terve programm näeb seega välja selline:
import PySimpleGUI as sg sg.theme('Dark Blue 3') #funktsioon arvutustehte sooritamiseks def arvuta(arv): arvu_ruut = arv**2 return arvu_ruut paigutus = [[sg.Text('Mis on arvu ruut?', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-100:', size=(20, 1)), sg.Input(key='sisestatud_arv')], [sg.Submit('Arvuta!'), sg.Cancel('Sulge aken')], [sg.Text('_' * 30)], [sg.Text('Arvu ... ruut on ... ', size=(20,1), key='tekstisilt')]] aken = sg.Window('Arvutustehe', paigutus, size=(400,200)) while True: syndmus, v22rtused = aken.read() if syndmus == sg.WIN_CLOSED or syndmus == 'Sulge aken': break if syndmus == 'Arvuta!': #teisendame sisendi täisarvuks, et sellega saaks arvutustehet sooritada sisend1 = int(v22rtused['sisestatud_arv']) #kasutame funktsiooni tehte sooritamiseks #vastuse salvestame muutujasse vastus vastus = arvuta(sisend1) aken['tekstisilt'].update('Arvu ' + str(sisend1) + ' ruut on ' + str(vastus)) aken['sisestatud_arv'].update('') aken.close()
Avanema peaks esmalt selline aken:
Ning pärast arvu sisestamist ja nupuvajutust:
Hüpikaken
Loome pop-up– ehk hüpikakna, mis avaneb pärast põhiakna sulgemist. Selle akna eripäraks on see, et selliselt saab kasutajale mugavalt kuvada erinevat infot näiteks siis, kui mõnes programmis tekib veateate akna vajadus või kui on vaja mõnda muud lihtsamat infot kuvada.
Jätkame eelmist näidet ning kontrollime, kas sisestatud arv oli õiges vahemikus (0-100). Kui jah, tuleb sooritada arvutustehe ning selle vastus kuvada hüpikaknas. Hüpikakna saame luua, kui kasutame funktsiooni sg.Popup(). Sulgude sisse kirjutame teksti, mida kuvada selles hüpikaknas. Pane tähele, et int– või float-tüüpi muutujad tuleb sõnedeks teisendada, et neid saaks aknas kuvada!
if syndmus == 'Arvuta!': sisend1 = int(v22rtused['sisestatud_arv']) if sisend1 >= 0 and sisend1 <= 100: #sulgeme akna kohe, et avada hüpikaken aken.close() vastus = arvuta(sisend1) #loome hüpikakna! sg.Popup('Arvu ' + str(sisend1) + ' ruut on ' + str(vastus))
Kui sisestatud arv ei olnud nõutud vahemikus, siis kuvame ekraanile hüpikakna, mis kasutajat veast teavitab. Selles aknas on ‘OK’ nupp, millele vajutades saab programm tegevust jätkata.
else: sg.Popup('Palun sisesta arv õiges vahemikus!')
Et vältida võimalikku segadust treppimisega, on siin ka terve kood:
import PySimpleGUI as sg sg.theme('Dark Blue 3') #funktsioon arvutustehte sooritamiseks def arvuta(arv): arvu_ruut = arv**2 return arvu_ruut paigutus = [[sg.Text('Mis on arvu ruut?', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-100:', size=(20, 1)), sg.Input(key='sisestatud_arv')], [sg.Submit('Arvuta!'), sg.Cancel('Sulge aken')], [sg.Text('_' * 30)], [sg.Text('Arvu ... ruut on ... ', size=(20,1), key='tekstisilt')]] aken = sg.Window('Arvutustehe', paigutus, size=(400,200)) while True: syndmus, v22rtused = aken.read() if syndmus == sg.WIN_CLOSED or syndmus == 'Sulge aken': break if syndmus == 'Arvuta!': #teisendame sisendid täisarvuks, et arvutustehet sooritada sisend1 = int(v22rtused['sisestatud_arv']) if sisend1 >= 0 and sisend1 <= 100: aken.close() #kasutame funktsiooni tehte sooritamiseks #vastuse salvestame muutujasse vastus vastus = arvuta(sisend1) sg.Popup('Arvu ' + str(sisend1) + ' ruut on ' + str(vastus)) else: sg.Popup('Palun sisesta arv õiges vahemikus!') aken.close()
Pärast programmi käivitamist, õiges vahemikus arvu sisestamist ja “Arvuta!”-nupule vajutamist peaks avanema hüpikaken:
Vales vahemikus arvu sisestamisel avaneb aga selline aken:
Aknasse saab lisaks ‘OK’-nupule tegelikult paigutada ka teisigi nuppe. Lisavõimalusi võid uurida siit.
Uue graafikaakne avamine
Kuidas aga teha nii, et graafikaaknas nupule vajutades ilmuks ekraanile järgmine aken, kus saaks jälle midagi kasutajalt küsida ning seejärel sisestatud vastuseid omakorda hüpikaknas kuvada?
Tegelikult pole siingi midagi keerulist, sest tuleb korrata juba tuttavat teemat – luua uus järjend uute elementidega (paigutus2
), luua uus aken, saada kätte uued sisendid.
Katsetame seda ühe lihtsa arvutusprogrammi abil – esimeses aknas küsitakse kasutajalt kahte arvu, millega tehakse liitmistehe ning teise akna sisenditega sooritatakse lahutamistehe. Sisestatud arve ning tehete vastuseid kuvame hüpikaknas.
PS! Tuleta meelde, et tekstikastist saame kasutaja sisendid sõne ehk string kujul. See tähendab, et arvutustehte jaoks peame need arvudeks (siin näites täisarvuks ehk integeriks) teisendama.
Esmalt impordime vajalikud moodulid, sätestame teema, loome paigutuse ning graafikaakna.
import PySimpleGUI as sg sg.theme('Dark Blue 3') paigutus = [[sg.Text('Liitmine ', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-10: ', size=(17, 1)), sg.Input()], [sg.Text('Sisesta täisarv 0-10: ', size=(17, 1)), sg.Input()], [sg.Submit('LIIDA!'), sg.Cancel('Sulge aken')]] aken = sg.Window('Arvutustehted', paigutus, size=(300,200))
Seejärel siseneme while-tsüklisse ning salvestame aknast saadud info muutujatesse. Samuti lisame tingimuslause juhuks, kui aken suletakse.
while True: syndmus, v22rtused = aken.read() if syndmus == sg.WIN_CLOSED or syndmus == 'Sulge aken': break
Kui aga vajutati nuppu “LIIDA!”, suletakse esmalt esimene graafikaaken. Seejärel salvestame sisendid muutujatesse sisend1
ning sisend2
ning teisendame need täisarvudeks int(), et saaks liitmistehet sooritada.
if syndmus == 'LIIDA!': aken.close() sisend1 = int(v22rtused[0]) sisend2 = int(v22rtused[1]) summa = sisend1 + sisend2
On aeg luua järgmise akna paigutus. See on identne eelmisega, kuid nüüd peab kasutaja sisestama arvud, mis lahutatakse üksteisest. Pane tähele, et me oleme endiselt while-tsükli sees!
#loome uue järjendi uute elementidega paigutus2 = [[sg.Text('Lahutamine: ', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-10: ', size=(17, 1)), sg.InputText()], [sg.Text('Sisesta arv 0-10: ', size=(17, 1)), sg.InputText()], [sg.Submit('LAHUTA!'), sg.Cancel('Sulge aken')]] #loome akna uue järjendiga aken = sg.Window('Andmed 2', paigutus2, size=(300,200)) syndmus2, v22rtused2 = aken.read()
Nüüd tuleb jälle kontrollida juhtu, kui aken pandi kinni.
if syndmus2 == sg.WIN_CLOSED or syndmus2 == 'Sulge aken': break
Kui mitte, tuleb taas salvestada sisendid muutujatesse ning sooritada arvutustehe.
if syndmus2 == 'LAHUTA!': aken.close() #teisendame teisest aknast saadud sisendid arvudeks, et nendega saaks lahutustehet sooritada sisend3 = int(v22rtused2[0]) sisend4 = int(v22rtused2[1]) vahe = sisend3 - sisend4
Olemegi kasutajalt kogu vajaliku info kätte saanud. Nüüd võiks nii liitmis-kui ka lahutamistehet ning nende vastuseid kuvada hüpikaknas.
#kuvame ekraanile sisendid ja arvutustehete vastused mugaval kujul sg.Popup('Tehete vastused: ', str(sisend1) + ' + ' + str(sisend2) + ' = ' + str(summa), str(sisend3) + ' - ' + str(sisend4) + ' = ' + str(vahe))
Kõige lõppu tuleb ka lisada rida, millega pannakse aken kinni (siia jõutakse siis, kui aken pandi ristist kinni või vajutati ‘Sulge aken’ nuppu).
aken.close()
Terve programm:
import PySimpleGUI as sg sg.theme('Dark Blue 3') paigutus = [[sg.Text('Liitmine ', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-10: ', size=(17, 1)), sg.Input()], [sg.Text('Sisesta täisarv 0-10: ', size=(17, 1)), sg.Input()], [sg.Submit('LIIDA!'), sg.Cancel('Sulge aken')]] aken = sg.Window('Arvutustehted', paigutus, size=(300,200)) while True: syndmus, v22rtused = aken.read() if syndmus == sg.WIN_CLOSED or syndmus == 'Sulge aken': break if syndmus == 'LIIDA!': aken.close() #teisendame sisendid täisarvudeks, et nendega saaks liitmistehet sooritada sisend1 = int(v22rtused[0]) sisend2 = int(v22rtused[1]) summa = sisend1 + sisend2 #loome uue järjendi uute elementidega paigutus2 = [[sg.Text('Lahutamine: ', text_color='white', font=('Helvetica', 15))], [sg.Text('Sisesta täisarv 0-10: ', size=(17, 1)), sg.InputText()], [sg.Text('Sisesta arv 0-10: ', size=(17, 1)), sg.InputText()], [sg.Submit('LAHUTA!'), sg.Cancel('Sulge aken')]] #loome akna uue järjendiga aken = sg.Window('Andmed 2', paigutus2, size=(300,200)) syndmus2, v22rtused2 = aken.read() #kui aken pandi kinni, lõpetab programm töö if syndmus2 == sg.WIN_CLOSED or syndmus2 == 'Sulge aken': break #kui vajutatakse nuppu 'LAHUTA!', pannakse aken kinni ja avatakse uus if syndmus2 == 'LAHUTA!': aken.close() #teisendame teisest aknast saadud sisendid arvudeks, et nendega saaks lahutustehet sooritada sisend3 = int(v22rtused2[0]) sisend4 = int(v22rtused2[1]) vahe = sisend3-sisend4 #kuvame ekraanile sisendid ja arvutustehete vastused mugaval kujul sg.Popup('Tehete vastused: ', str(sisend1) + ' + ' + str(sisend2) + ' = ' + str(summa), str(sisend3) + ' - ' + str(sisend4) + ' = ' + str(vahe)) aken.close()
Avanema peaksid järjest sellised aknad:
Seega selles peatükis õppisid, kuidas integreerida erinevaid võtteid ja elemente oma programmi – õppisid looma hüpikakent, uut graafikaaknet, kasutama programmis funktsiooni ja tsükleid. Ühtlasi katsetasid, kuidas muuta programmi tegevust vastavalt sellele, mida graafikaaknasse sisestati.