70 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.

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut