{"id":112,"date":"2018-12-11T19:49:27","date_gmt":"2018-12-11T19:49:27","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=112"},"modified":"2025-12-12T12:33:23","modified_gmt":"2025-12-12T12:33:23","slug":"kasutajaliides-tkinteriga","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/kasutajaliides-tkinteriga\/","title":{"raw":"Lisalugemine. Kasutajaliides Tkinteriga","rendered":"Lisalugemine. Kasutajaliides Tkinteriga"},"content":{"raw":"Selles peat\u00fckis kasutame Tkinterit, et luua graafilise kasutajaliidesega programme. Vaatleme levinumaid kasutajaliidese komponente (sildid, nupud, tekstikastid, pildid) ning nende paigutamist.\r\n<h3>Kasutajaliidese komponendid<\/h3>\r\nAlustame lihtsa n\u00e4iteprogrammiga. Seda programmi k\u00e4ivitades peaksid saama \u00fche v\u00e4ikese akna, milles on tekstikast nime sisestamiseks ning nupp, mida vajutades saad nimelise tervituse.\r\n\r\n<strong>N\u00e4iteprogramm. Tervitusaken<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># impordi tk vidinad ja konstandid\r\nfrom tkinter import *            # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk          # platvormi \u00fchise stiili saamiseks\r\nfrom tkinter import messagebox\r\n \r\n# see funktsioon k\u00e4ivitatakse nupule kl\u00f5psamisel\r\ndef tervita():\r\n    tervitus = 'Tere, ' + nimi.get()\r\n    messagebox.showinfo(message=tervitus)\r\n \r\n \r\n# loome akna\r\nraam = Tk()\r\nraam.title(\"Tervitaja\")\r\nraam.geometry(\"300x100\")\r\n \r\n# loome tekstikasti jaoks sildi\r\nsilt = ttk.Label(raam, text=\"Nimi\")\r\nsilt.place(x=5, y=5)\r\n \r\n# loome tekstikasti\r\nnimi = ttk.Entry(raam)\r\nnimi.place(x=70, y=5, width=150)\r\n \r\n# loome nupu\r\nnupp = ttk.Button(raam, text=\"Tervita!\", command=tervita)\r\nnupp.place(x=70, y=40, width=150)\r\n \r\n# ilmutame akna ekraanile\r\nraam.mainloop()<\/pre>\r\nFunktsioon\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tervita<\/code> on m\u00f5eldud k\u00e4ivitamiseks, kui kl\u00f5psatakse nupule. Funktsiooni kehas k\u00fcsitakse allpool defineeritud tekstikasti (<code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi<\/code>) sisu k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi.get()<\/code>, moodustatakse selle p\u00f5hjal tervitusega s\u00f5ne ning n\u00e4idatakse seda kasutajale v\u00e4ikses lisaaknas. (Selles funktsioonis oleme kasutanud <strong>globaalset muutujat<\/strong> \u2013 <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi<\/code><\/code> pole ei funktsiooni argument ega lokaalne muutuja, vaid funktsioonist v\u00e4ljaspool defineeritud muutuja.)\r\n\r\nProgrammis kasutatakse kolme kasutajaliidese komponenti ehk <strong>vidinat <\/strong>(<em>widget<\/em>).\r\n\r\nFunktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ttk.Label<\/code> loob \u00fche <strong>sildi<\/strong> (vidina teksti n\u00e4itamiseks). Funktsiooni esimese argumendiga n\u00e4itame, et me soovime seda silti kasutada eespool loodud aknas. Kasutades nimelist argumenti <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">text<\/code>, anname sellele sildile soovitud teksti. K\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">silt.place(...) <\/code>paigutab loodud sildi soovitud koordinaatidele (\u00fchikuteks on pikslid, punkt (0,0) paikneb akna sisuosa \u00fclemises vasakus nurgas ning koordinaadid kasvavad paremale\/alla liikudes).\r\n\r\n[caption id=\"attachment_106\" align=\"aligncenter\" width=\"248\"]<img class=\"size-full wp-image-106\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/xytelg.png\" alt=\"\" width=\"248\" height=\"204\" \/> Joonis 1. Koordinaadid aknas[\/caption]\r\n\r\nJ\u00e4rgmises plokis l\u00f5ime ja seadsime paika <strong>tekstisisestuskasti<\/strong> (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ttk.Entry<\/code><\/code>). Selle paigutamisel n\u00e4itame \u00e4ra ka soovitud laiuse.\r\n<p class=\"vspace\"><strong>Nupu<\/strong> (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ttk.Button<\/code><\/code>) loomisel m\u00e4\u00e4rame argumendiga <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">command<\/code><\/em>, mida tuleb teha nupule kl\u00f5psamise korral. Paneme t\u00e4hele, et argumendi v\u00e4\u00e4rtuseks on ainult funktsiooni nimi, mitte funktsiooni v\u00e4ljakutse (see oleks olnud koos t\u00fchjade sulgudega). P\u00f5hjus on selles, et me ei taha seda funktsiooni k\u00e4ivitada mitte nupu loomise ajal, vaid siis, kui nupule kl\u00f5psatakse.<\/p>\r\n<p class=\"vspace\">Lisaks on programmis read, mis olid juba eelmise osa n\u00e4idetes ja on \u00fcldjuhul olemas igas <em>tkinter<\/em>i programmis. Programmi sisuline olemus s\u00f5ltub sellest, milliseid vidinaid aknasse paigutatakse ning kuidas kasutaja tegevustele reageeritakse. V\u00f5imalike vidinate valimiseks v\u00f5id uurida lehek\u00fclge aadressil <a class=\"urllink\" href=\"http:\/\/www.tkdocs.com\/tutorial\/widgets.html\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.tkdocs.com\/tutorial\/widgets.html<\/a>.<\/p>\r\n\r\n<h2>Vidinate paigutamine<\/h2>\r\n<p class=\"vspace\">Eelmist n\u00e4iteprogrammi k\u00e4ivitades ei pruugi sa olla rahul vidinate paigutusega. Paigutust saab muuta etteantud koordinaate ja m\u00f5\u00f5tmeid korrigeerides. Paraku on selline pikselhaaval timmimine t\u00e4namatu t\u00f6\u00f6, kuna m\u00f5nes teises operatsioonis\u00fcsteemis (v\u00f5i teistsuguste seadetega arvutis) ei pruugi paigutus samasugune v\u00e4lja n\u00e4ha.<\/p>\r\n<p class=\"vspace\">Vidinate paigutust on v\u00f5imalik muuta \u00fcldisemalt kui pikslite tasemel, lubades Tkinteril valida vastavalt olukorrale k\u00f5ige parema konkreetse paigutuse. J\u00e4rgnevas programmis on vidinate paigutamiseks kasutatud meetodi <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">place<\/code> asemel meetodit <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grid<\/code>, mis jagab kasutajaliidese m\u00f5tteliselt ruudustikuks ning paigutab iga vidina soovitud lahtrisse vastavalt argumentidele <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">column<\/code><\/em> ja <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">row<\/code>.\r\n<\/em><\/p>\r\n<strong>N\u00e4iteprogramm. Vidinate paigutamine<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from tkinter import *\r\nfrom tkinter import ttk\r\nfrom tkinter import messagebox\r\n \r\ndef tervita():\r\n    tervitus = 'Tere, ' + nimi.get()\r\n    messagebox.showinfo(message=tervitus)\r\n \r\n \r\nraam = Tk()\r\nraam.title(\"Tervitaja\")\r\n# raam.geometry(\"300x100\")   # akna algne suurus m\u00e4\u00e4ratakse vastavalt sisule\r\n \r\n \r\n# paigutame sildi ruudustiku \u00fclemisse vasakusse lahtrisse (column ja row)\r\n# soovime, et sildi \u00fcmber j\u00e4\u00e4ks igas suunas 5 pikslit vaba ruumi (padx ja pady)\r\n# soovime, et silt \"kleepuks\" oma lahtris \u00fclemisse vasakusse nurka (sticky)\r\n# N - north, W - west\r\nsilt = ttk.Label(raam, text=\"Nimi\")\r\nsilt.grid(column=0, row=0, padx=5, pady=5, sticky=(N, W))\r\n \r\n# tekstikasti puhul soovime, et ta kleepuks nii ida- kui l\u00e4\u00e4neserva k\u00fclge\r\n# st ta peab venima vastavalt akna suurusele\r\nnimi = ttk.Entry(raam)\r\nnimi.grid(column=1, row=0, padx=5, pady=5, sticky=(N, W, E))\r\n \r\n# soovime, et nupp veniks nii laiuses kui ka k\u00f5rguses\r\nnupp = ttk.Button(raam, text=\"Tervita!\", command=tervita)\r\nnupp.grid(column=1, row=1, padx=5, pady=5, sticky=(N, S, W, E))\r\n \r\n# soovime, et akna suuruse muutmisel muudetakse veeru 1 ja rea 1 m\u00f5\u00f5tmeid\r\n# (st. veerg 0 ja rida 0 j\u00e4\u00e4vad sama laiaks\/k\u00f5rgeks)\r\nraam.columnconfigure(1, weight=1)\r\nraam.rowconfigure(1, weight=1)\r\n \r\n# kuvame akna ekraanile\r\nraam.mainloop()<\/pre>\r\nLisaks meetoditele <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">place<\/code><\/em> ja <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grid<\/code><\/em> v\u00f5ib kohata veel paigutusmeetodit <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">pack<\/code><\/em>, mida kasutasime tahvli puhul eelmises osas. Rohkem infot saab siit: <a class=\"urllink\" href=\"http:\/\/www.tkdocs.com\/tutorial\/concepts.html#geometry\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.tkdocs.com\/tutorial\/concepts.html#geometry<\/a>.\r\n<h2>Pildid tahvlile<\/h2>\r\nPildifaile kasutades on v\u00f5imalik tahvlile lisada pilte. Lubatud on .gif, .pgm ja .ppm formaadis pildifailid. J\u00e4rgmise n\u00e4ite kasutamiseks salvesta programmiga samasse kausta j\u00e4rgmised failid: <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/kuusk.gif\">kuusk.gif<\/a>, <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/lill.gif\">lill.gif<\/a>.\r\n\r\n<strong>N\u00e4iteprogramm. Pildid tahvlil<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from tkinter import *\r\n \r\nraam = Tk()\r\nraam.title(\"Tahvel\")\r\ntahvel = Canvas(raam, width=400, height=400, background=\"white\")\r\ntahvel.grid()\r\n \r\n# pildi kuvamisel on vaja k\u00f5igepealt laadida pilt ja panna see siis tahvlile\r\nkuusk = PhotoImage(file=\"kuusk.gif\")\r\nimg = tahvel.create_image(250, 80, image=kuusk)\r\n \r\n# activeimage m\u00e4\u00e4rab pildi, mida n\u00e4idatakse, kui hiirekursor on pildi kohal\r\n# anchor n\u00e4itab, mille j\u00e4rgi pilt paigutatakse (antud juhul \u00fclemise-vasaku nurga j\u00e4rgi)\r\nlill = PhotoImage(file=\"lill.gif\")\r\nimg = tahvel.create_image(50, 200, image=lill, activeimage=lill, anchor=NW)\r\n \r\nraam.mainloop()<\/pre>\r\n<h2>Fonolukk<\/h2>\r\nVaatame n\u00fc\u00fcd programmi, mis loob ekraanile fonoluku klahvistiku. Loe l\u00e4htekoodi ja m\u00f5tle, kuidas l\u00f5pptulemuseni j\u00f5utakse.\r\n\r\n<strong>N\u00e4iteprogramm. Fonolukk<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">#Impordime k\u00f5ik vajalikud teegid\r\nfrom tkinter import *\r\nfrom tkinter import ttk\r\n \r\n#Loome raami ja paneme raamile pealkirja\r\nraam = Tk()\r\nraam.title(\"Fonolukk\")\r\n \r\n#Fonoluku ekraani osa\r\nkood = ttk.Entry(raam).grid(row = 0, column = 0, columnspan = 3, rowspan = 1, sticky = (N, W, E), padx=5, pady=5)\r\n \r\n#Lisame fonolukule numbrid\r\nrida = 1\r\nveerg = 0\r\narv_nupul = 1\r\nwhile arv_nupul &lt; 10:\r\n    #Lisame nupu\r\n    ttk.Button(raam, text = str(arv_nupul)).grid(row = rida, column = veerg, padx = 5, pady = 5)\r\n    #Kui arv_nupul jagub 3-ga, siis paneme j\u00e4rgmise arvu uude ritta ja nullime veeru v\u00e4\u00e4rtuse\r\n    if arv_nupul % 3 == 0:\r\n        rida += 1\r\n        veerg = 0\r\n    #Kui arv_nupul ei jagu 3-ga, siis suurendame veeru v\u00e4\u00e4rtust.\r\n    else:\r\n        veerg += 1\r\n \r\n    #Suurendame arvu v\u00e4\u00e4rtust\r\n    arv_nupul += 1\r\n \r\n#Lisame ka teised fonolukul esinevad s\u00fcmbolid\r\nttk.Button(raam, text = \"*\").grid(row = 4, column = 0, padx = 5, pady = 5)\r\nttk.Button(raam, text = \"0\").grid(row = 4, column = 1, padx = 5, pady = 5)\r\nttk.Button(raam, text = \"#\").grid(row = 4, column = 2, padx = 5, pady = 5)\r\n \r\n#Kuvame ekraanile\r\nraam.mainloop()<\/pre>\r\nPalun kommenteeri seda materjali <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSfG6gYUGXVpco0wYo61N-06xY6LkCc41PgR4uMfJrnfwbxKIQ\/viewform\" target=\"_blank\" rel=\"noopener noreferrer\">Google'i k\u00fcsimustikus<\/a>.","rendered":"<p>Selles peat\u00fckis kasutame Tkinterit, et luua graafilise kasutajaliidesega programme. Vaatleme levinumaid kasutajaliidese komponente (sildid, nupud, tekstikastid, pildid) ning nende paigutamist.<\/p>\n<h3>Kasutajaliidese komponendid<\/h3>\n<p>Alustame lihtsa n\u00e4iteprogrammiga. Seda programmi k\u00e4ivitades peaksid saama \u00fche v\u00e4ikese akna, milles on tekstikast nime sisestamiseks ning nupp, mida vajutades saad nimelise tervituse.<\/p>\n<p><strong>N\u00e4iteprogramm. Tervitusaken<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># impordi tk vidinad ja konstandid\r\nfrom tkinter import *            # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk          # platvormi \u00fchise stiili saamiseks\r\nfrom tkinter import messagebox\r\n \r\n# see funktsioon k\u00e4ivitatakse nupule kl\u00f5psamisel\r\ndef tervita():\r\n    tervitus = 'Tere, ' + nimi.get()\r\n    messagebox.showinfo(message=tervitus)\r\n \r\n \r\n# loome akna\r\nraam = Tk()\r\nraam.title(\"Tervitaja\")\r\nraam.geometry(\"300x100\")\r\n \r\n# loome tekstikasti jaoks sildi\r\nsilt = ttk.Label(raam, text=\"Nimi\")\r\nsilt.place(x=5, y=5)\r\n \r\n# loome tekstikasti\r\nnimi = ttk.Entry(raam)\r\nnimi.place(x=70, y=5, width=150)\r\n \r\n# loome nupu\r\nnupp = ttk.Button(raam, text=\"Tervita!\", command=tervita)\r\nnupp.place(x=70, y=40, width=150)\r\n \r\n# ilmutame akna ekraanile\r\nraam.mainloop()<\/pre>\n<p>Funktsioon\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tervita<\/code> on m\u00f5eldud k\u00e4ivitamiseks, kui kl\u00f5psatakse nupule. Funktsiooni kehas k\u00fcsitakse allpool defineeritud tekstikasti (<code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi<\/code>) sisu k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi.get()<\/code>, moodustatakse selle p\u00f5hjal tervitusega s\u00f5ne ning n\u00e4idatakse seda kasutajale v\u00e4ikses lisaaknas. (Selles funktsioonis oleme kasutanud <strong>globaalset muutujat<\/strong> \u2013 <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi<\/code><\/code> pole ei funktsiooni argument ega lokaalne muutuja, vaid funktsioonist v\u00e4ljaspool defineeritud muutuja.)<\/p>\n<p>Programmis kasutatakse kolme kasutajaliidese komponenti ehk <strong>vidinat <\/strong>(<em>widget<\/em>).<\/p>\n<p>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ttk.Label<\/code> loob \u00fche <strong>sildi<\/strong> (vidina teksti n\u00e4itamiseks). Funktsiooni esimese argumendiga n\u00e4itame, et me soovime seda silti kasutada eespool loodud aknas. Kasutades nimelist argumenti <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">text<\/code>, anname sellele sildile soovitud teksti. K\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">silt.place(...) <\/code>paigutab loodud sildi soovitud koordinaatidele (\u00fchikuteks on pikslid, punkt (0,0) paikneb akna sisuosa \u00fclemises vasakus nurgas ning koordinaadid kasvavad paremale\/alla liikudes).<\/p>\n<figure id=\"attachment_106\" aria-describedby=\"caption-attachment-106\" style=\"width: 248px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-106\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/xytelg.png\" alt=\"\" width=\"248\" height=\"204\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/xytelg.png 248w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/xytelg-65x53.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/xytelg-225x185.png 225w\" sizes=\"auto, (max-width: 248px) 100vw, 248px\" \/><figcaption id=\"caption-attachment-106\" class=\"wp-caption-text\">Joonis 1. Koordinaadid aknas<\/figcaption><\/figure>\n<p>J\u00e4rgmises plokis l\u00f5ime ja seadsime paika <strong>tekstisisestuskasti<\/strong> (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ttk.Entry<\/code><\/code>). Selle paigutamisel n\u00e4itame \u00e4ra ka soovitud laiuse.<\/p>\n<p class=\"vspace\"><strong>Nupu<\/strong> (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ttk.Button<\/code><\/code>) loomisel m\u00e4\u00e4rame argumendiga <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">command<\/code><\/em>, mida tuleb teha nupule kl\u00f5psamise korral. Paneme t\u00e4hele, et argumendi v\u00e4\u00e4rtuseks on ainult funktsiooni nimi, mitte funktsiooni v\u00e4ljakutse (see oleks olnud koos t\u00fchjade sulgudega). P\u00f5hjus on selles, et me ei taha seda funktsiooni k\u00e4ivitada mitte nupu loomise ajal, vaid siis, kui nupule kl\u00f5psatakse.<\/p>\n<p class=\"vspace\">Lisaks on programmis read, mis olid juba eelmise osa n\u00e4idetes ja on \u00fcldjuhul olemas igas <em>tkinter<\/em>i programmis. Programmi sisuline olemus s\u00f5ltub sellest, milliseid vidinaid aknasse paigutatakse ning kuidas kasutaja tegevustele reageeritakse. V\u00f5imalike vidinate valimiseks v\u00f5id uurida lehek\u00fclge aadressil <a class=\"urllink\" href=\"http:\/\/www.tkdocs.com\/tutorial\/widgets.html\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.tkdocs.com\/tutorial\/widgets.html<\/a>.<\/p>\n<h2>Vidinate paigutamine<\/h2>\n<p class=\"vspace\">Eelmist n\u00e4iteprogrammi k\u00e4ivitades ei pruugi sa olla rahul vidinate paigutusega. Paigutust saab muuta etteantud koordinaate ja m\u00f5\u00f5tmeid korrigeerides. Paraku on selline pikselhaaval timmimine t\u00e4namatu t\u00f6\u00f6, kuna m\u00f5nes teises operatsioonis\u00fcsteemis (v\u00f5i teistsuguste seadetega arvutis) ei pruugi paigutus samasugune v\u00e4lja n\u00e4ha.<\/p>\n<p class=\"vspace\">Vidinate paigutust on v\u00f5imalik muuta \u00fcldisemalt kui pikslite tasemel, lubades Tkinteril valida vastavalt olukorrale k\u00f5ige parema konkreetse paigutuse. J\u00e4rgnevas programmis on vidinate paigutamiseks kasutatud meetodi <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">place<\/code> asemel meetodit <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grid<\/code>, mis jagab kasutajaliidese m\u00f5tteliselt ruudustikuks ning paigutab iga vidina soovitud lahtrisse vastavalt argumentidele <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">column<\/code><\/em> ja <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">row<\/code>.<br \/>\n<\/em><\/p>\n<p><strong>N\u00e4iteprogramm. Vidinate paigutamine<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from tkinter import *\r\nfrom tkinter import ttk\r\nfrom tkinter import messagebox\r\n \r\ndef tervita():\r\n    tervitus = 'Tere, ' + nimi.get()\r\n    messagebox.showinfo(message=tervitus)\r\n \r\n \r\nraam = Tk()\r\nraam.title(\"Tervitaja\")\r\n# raam.geometry(\"300x100\")   # akna algne suurus m\u00e4\u00e4ratakse vastavalt sisule\r\n \r\n \r\n# paigutame sildi ruudustiku \u00fclemisse vasakusse lahtrisse (column ja row)\r\n# soovime, et sildi \u00fcmber j\u00e4\u00e4ks igas suunas 5 pikslit vaba ruumi (padx ja pady)\r\n# soovime, et silt \"kleepuks\" oma lahtris \u00fclemisse vasakusse nurka (sticky)\r\n# N - north, W - west\r\nsilt = ttk.Label(raam, text=\"Nimi\")\r\nsilt.grid(column=0, row=0, padx=5, pady=5, sticky=(N, W))\r\n \r\n# tekstikasti puhul soovime, et ta kleepuks nii ida- kui l\u00e4\u00e4neserva k\u00fclge\r\n# st ta peab venima vastavalt akna suurusele\r\nnimi = ttk.Entry(raam)\r\nnimi.grid(column=1, row=0, padx=5, pady=5, sticky=(N, W, E))\r\n \r\n# soovime, et nupp veniks nii laiuses kui ka k\u00f5rguses\r\nnupp = ttk.Button(raam, text=\"Tervita!\", command=tervita)\r\nnupp.grid(column=1, row=1, padx=5, pady=5, sticky=(N, S, W, E))\r\n \r\n# soovime, et akna suuruse muutmisel muudetakse veeru 1 ja rea 1 m\u00f5\u00f5tmeid\r\n# (st. veerg 0 ja rida 0 j\u00e4\u00e4vad sama laiaks\/k\u00f5rgeks)\r\nraam.columnconfigure(1, weight=1)\r\nraam.rowconfigure(1, weight=1)\r\n \r\n# kuvame akna ekraanile\r\nraam.mainloop()<\/pre>\n<p>Lisaks meetoditele <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">place<\/code><\/em> ja <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">grid<\/code><\/em> v\u00f5ib kohata veel paigutusmeetodit <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">pack<\/code><\/em>, mida kasutasime tahvli puhul eelmises osas. Rohkem infot saab siit: <a class=\"urllink\" href=\"http:\/\/www.tkdocs.com\/tutorial\/concepts.html#geometry\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.tkdocs.com\/tutorial\/concepts.html#geometry<\/a>.<\/p>\n<h2>Pildid tahvlile<\/h2>\n<p>Pildifaile kasutades on v\u00f5imalik tahvlile lisada pilte. Lubatud on .gif, .pgm ja .ppm formaadis pildifailid. J\u00e4rgmise n\u00e4ite kasutamiseks salvesta programmiga samasse kausta j\u00e4rgmised failid: <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/kuusk.gif\">kuusk.gif<\/a>, <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/lill.gif\">lill.gif<\/a>.<\/p>\n<p><strong>N\u00e4iteprogramm. Pildid tahvlil<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from tkinter import *\r\n \r\nraam = Tk()\r\nraam.title(\"Tahvel\")\r\ntahvel = Canvas(raam, width=400, height=400, background=\"white\")\r\ntahvel.grid()\r\n \r\n# pildi kuvamisel on vaja k\u00f5igepealt laadida pilt ja panna see siis tahvlile\r\nkuusk = PhotoImage(file=\"kuusk.gif\")\r\nimg = tahvel.create_image(250, 80, image=kuusk)\r\n \r\n# activeimage m\u00e4\u00e4rab pildi, mida n\u00e4idatakse, kui hiirekursor on pildi kohal\r\n# anchor n\u00e4itab, mille j\u00e4rgi pilt paigutatakse (antud juhul \u00fclemise-vasaku nurga j\u00e4rgi)\r\nlill = PhotoImage(file=\"lill.gif\")\r\nimg = tahvel.create_image(50, 200, image=lill, activeimage=lill, anchor=NW)\r\n \r\nraam.mainloop()<\/pre>\n<h2>Fonolukk<\/h2>\n<p>Vaatame n\u00fc\u00fcd programmi, mis loob ekraanile fonoluku klahvistiku. Loe l\u00e4htekoodi ja m\u00f5tle, kuidas l\u00f5pptulemuseni j\u00f5utakse.<\/p>\n<p><strong>N\u00e4iteprogramm. Fonolukk<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">#Impordime k\u00f5ik vajalikud teegid\r\nfrom tkinter import *\r\nfrom tkinter import ttk\r\n \r\n#Loome raami ja paneme raamile pealkirja\r\nraam = Tk()\r\nraam.title(\"Fonolukk\")\r\n \r\n#Fonoluku ekraani osa\r\nkood = ttk.Entry(raam).grid(row = 0, column = 0, columnspan = 3, rowspan = 1, sticky = (N, W, E), padx=5, pady=5)\r\n \r\n#Lisame fonolukule numbrid\r\nrida = 1\r\nveerg = 0\r\narv_nupul = 1\r\nwhile arv_nupul &lt; 10:\r\n    #Lisame nupu\r\n    ttk.Button(raam, text = str(arv_nupul)).grid(row = rida, column = veerg, padx = 5, pady = 5)\r\n    #Kui arv_nupul jagub 3-ga, siis paneme j\u00e4rgmise arvu uude ritta ja nullime veeru v\u00e4\u00e4rtuse\r\n    if arv_nupul % 3 == 0:\r\n        rida += 1\r\n        veerg = 0\r\n    #Kui arv_nupul ei jagu 3-ga, siis suurendame veeru v\u00e4\u00e4rtust.\r\n    else:\r\n        veerg += 1\r\n \r\n    #Suurendame arvu v\u00e4\u00e4rtust\r\n    arv_nupul += 1\r\n \r\n#Lisame ka teised fonolukul esinevad s\u00fcmbolid\r\nttk.Button(raam, text = \"*\").grid(row = 4, column = 0, padx = 5, pady = 5)\r\nttk.Button(raam, text = \"0\").grid(row = 4, column = 1, padx = 5, pady = 5)\r\nttk.Button(raam, text = \"#\").grid(row = 4, column = 2, padx = 5, pady = 5)\r\n \r\n#Kuvame ekraanile\r\nraam.mainloop()<\/pre>\n<p>Palun kommenteeri seda materjali <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSfG6gYUGXVpco0wYo61N-06xY6LkCc41PgR4uMfJrnfwbxKIQ\/viewform\" target=\"_blank\" rel=\"noopener noreferrer\">Google&#8217;i k\u00fcsimustikus<\/a>.<\/p>\n","protected":false},"author":12,"menu_order":6,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-112","chapter","type-chapter","status-publish","hentry"],"part":97,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/12"}],"version-history":[{"count":9,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/112\/revisions"}],"predecessor-version":[{"id":598,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/112\/revisions\/598"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/97"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/112\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=112"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=112"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=112"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}