78 Tkinteri vidinad

Eelnevates näidisprogrammides oleme kasutanud erinevaid Tkinteri vidinaid nagu tekstisildid, tekstisisestuskastid ja nupud. Järgnevalt vaatame ükshaaval üle erinevad Tkinteri vidinaid näidete abil.

Tekstisilt

Tekstisildi loomiseks kasutasime käsklust:

tekstisilt = ttk.Label(raam, text="Tekstisildil olev tekst.")

Selleks, et kuvada tekstisildil muutuja väärtust, on võimalus luua StringVar tüüpi muutuja ja kasutada seda tekstisildil:

tekst = StringVar()
tekstisilt = ttk.Label(raam, textvariable = tekst)

Sellisel juhul tuleb tekstisildil olevat silti muuta muutes muutuja väärtust:
tekst.set("Tekstisildil olev tekst.")

Pildid tahvlile

Pildifaile kasutades on võimalik tahvlile lisada pilte. Lubatud on .gif, .png, .pgm ja .ppm formaadis pildifailid. Järgmise näite kasutamiseks salvesta programmiga samasse kausta järgmised failid: kuusk.gif, lill.gif.

Näiteprogramm. Pildid tahvlil

from tkinter import * # tkinteri põhivahendid
from tkinter import ttk # platvormi ühise stiili saamiseks

raam = Tk()
raam.title("Tahvel")
tahvel = Canvas(raam, width=400, height=400, background="white")
tahvel.grid()

# pildi kuvamisel on vaja kõigepealt laadida pilt ja panna see siis tahvlile
kuusk = PhotoImage(file="kuusk.gif")
img = tahvel.create_image(250, 80, image=kuusk)

# activeimage määrab pildi, mida näidatakse, kui hiirekursor on pildi kohal
# anchor näitab, mille järgi pilt paigutatakse (antud juhul ülemise-vasaku nurga järgi)
lill = PhotoImage(file="lill.gif")
img = tahvel.create_image(50, 200, image=kuusk, activeimage=lill, anchor=NW)

raam.mainloop()

Moodul PIL ja pildi suuruse muutmine

Tuntumate formaatide jaoks nagu JPEG/JPG ja PNG on vaja kasutada mooduli ImageTk abi ja pildiklasse PIL (Photo Imaging Library) paketist. Need paketid tuleks siis eelnevalt lisada (Thonnys valik Tools-> Manage Packages…) . PIL toetab üle 30 erineva pildiformaadi ja muudab need programmi jaoks pildiobjektideks.

Vaatame näidet, kuidas kasutada

from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image #impordidakse PIL moodul
root = Tk()
canvas = Canvas(root, width = 300, height = 300)
canvas.pack()
pilt = Image.open("pall.png").resize((100, 100)) # pildi pall.png lisamine ja suuruse muutmine 100 piksli kõrguseks
pildiobjekt = ImageTk.PhotoImage(pilt) # pildiobjekti loomine tahvlile asetamiseks

# Järgmisel real on lisaks pildi lisamisele kasutatud parameetreid 20, 20 ja anchor, mida pole vaja kasutada.
# 20 ja 20 võimaldavad pildilt välja jätta 20 pikslit serva. Anchor näitab, et ära lõigatakse ülemine (N-north) ja vasak (W-west) serv.
canvas.create_image(20, 20, anchor=NW, image=pildiobjekt) # pildiobjekti lisamine tahvlile lõigates servad
root.mainloop()

Sageli läheb vaja pildi muutmist ka funktsioonis. Selleks võib luua muutuja pilt globaalsena: global pilt = … ja seda kasutada funktsioonis.

Nupp

Esimeses näiteprogrammis juba kasutasime nuppu. Nupu puhul on oluline määrata, kuhu see paigutatakse (raam), mis teksti sellel kuvatakse (“Tervita!”) ja mis funktsioon nupuvajutusel käivitatakse (tervita):

nupp = ttk.Button(raam, text='Tervita!" command=tervita)

Küll aga on nupul veel huvitavaid funktsioone:

nupp.invoke() # aktiveerib nupu selliselt, et saab vajutada ka enter-klahvi kasutades.

nupp.state(['disabled']) # muudab nupu mitteaktiivseks

nupp.state(['!disabled']) # eemaldab nupult mitteaktiivsuse

nupp.instate(['disabled']) # tagastab tõese väärtuse (True) kui nupp on mitteaktiivne

nupp.instate(['!disabled']) # tagastab väära väärtuse (False) kui pole mitteaktiivne

nupp.instate(['!disabled'], käsklus) # käivitab käskluse, kui nupp pole mitteaktiivne

Märkeruut

Vahel on vaja, et kasutaja programmis märgiks linnukesega sobivad valikud. Selleks saab kasutada märkeruutu (ingl checkbox).

Näiteprogramm märkeruudu märke lugemisest:

from tkinter import *
raam = Tk()
def valitud():
    print("Meessoost: " + str(muutuja1.get()) + ", naissoost: " + str(muutuja2.get()))

muutuja1 = IntVar()
Checkbutton(raam, text="mees", variable=muutuja1).grid(row=1, sticky=W)
muutuja2 = IntVar()
Checkbutton(raam, text="naine", variable=muutuja2).grid(row=2, sticky=W)
Button(raam, text="Näita tulemus", command=valitud).grid(row=4, sticky=W, pady=4)
mainloop()

Raadionupp

Kui märkeruut võimaldas valida mitu valikut, siis raadionupp (ingl radio button) on sarnaste võimalustega, kuid võimaldab valida ühe valiku.

Näiteprogramm raadiunupu kasutamisest:

from tkinter import *
from tkinter import ttk
def valitud():
valik = "Valisid valiku: " + str(muutuja.get())
silt.config(text = valik)

raam = Tk()

muutuja = IntVar()
R1 = Radiobutton(raam, text="Valik 1", variable=muutuja, value=1, command=valitud)
R1.pack( anchor = W )

R2 = Radiobutton(raam, text="Valik 2", variable=muutuja, value=2, command=valitud)
R2.pack( anchor = W )

R3 = Radiobutton(raam, text="Valik 3", variable=muutuja, value=3, command=valitud)
R3.pack(anchor = W)

silt = Label(raam)
silt.pack()
raam.mainloop()

Tekstisisestuskast

Tekstisisestuskasti kasutasime ka esimeses näiteprogrammis. Tasub vaid meelde tuletada, et tekstikastist teksti lugemiseks tasuks luua muutuja:

kasutajanimi = StringVar()

Ja seda saaks siis hiljem kasutada tekstikastist näiteks kasutajanime küsimisel:

nimi = ttk.Entry(raam, textvariable=kasutajanimi)

Tekstikasti sisestatud väärtuse saab funktsioonis kätte tekstikastist käsuga nimi.get().

Samuti saab tekstikasti tühjaks teha käsuga:

name.delete(0,'end')

Või vajadusel asendada mõne muu tekstiga:

name.insert(0, 'Sisesta siia kasutajanimi: ')

Kombokast

Kombokast (ingl combo box) annab võimaluse valida üks valik etteantud loetelust. Mugav on seda kasutada näiteks siis, kui on soov, et kasutaja teeks ühe valiku järjendi elementidest.

Kombokasti valikut saab näiteks kasutada selliselt:

muutuja = StringVar()

kombokast = ttk.Combobox(raam, textvariable=muutuja)

riigid['values'] = ('USA', 'Kanada', 'Austraalia')

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, ja Säde Mai Krusberg jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut