{"id":121,"date":"2020-11-03T09:34:16","date_gmt":"2020-11-03T09:34:16","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/?post_type=chapter&#038;p=121"},"modified":"2020-12-29T13:27:55","modified_gmt":"2020-12-29T13:27:55","slug":"tkinteri-kasutajaliidese-taiendamine","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/chapter\/tkinteri-kasutajaliidese-taiendamine\/","title":{"raw":"Kasutajaliidese t\u00e4iendamine ja nupu t\u00f6\u00f6le panemine","rendered":"Kasutajaliidese t\u00e4iendamine ja nupu t\u00f6\u00f6le panemine"},"content":{"raw":"T\u00e4iendame n\u00fc\u00fcd eelmist programmi veelgi. Kohendame v\u00e4limust selliselt, et:\r\n<ol>\r\n \t<li>Lisame funktsiooni arvuta, mis k\u00e4ivitatakse nupule vajutades. Selleks tuleb nupule lisada parameeter \u201ccommand = arvuta\u201d ja luua vastav funktsioon arvuta(), kus v\u00f5etakse meetrite tekstisisestuskastist meetrid, teisendatakse tulemus kilomeetriteks ning v\u00e4ljastatakse kasutajaliideses olevale tekstisildile kilomeetriteks teisendatud tulemus.<\/li>\r\n \t<li>Lisame tekstisiltidele joonduse <strong>N<\/strong>, <strong>S<\/strong>, <strong>E<\/strong>, <strong>W<\/strong>, mis joondavad teksti vastavalt ilmakaarele. N\u00e4iteks E (east) on paremjoondus ja W (west) on vasakjoondus.<\/li>\r\n \t<li>Viimase asjana lisame komponentide \u00fcmber vaba ruumi \u00e4\u00e4rtesse parameetriga padx ja \u00fcles ning alla parameetriga pady.<\/li>\r\n<\/ol>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from tkinter import *\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0 # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk\u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0 # platvormi \u00fchise stiili saamiseks\r\ndef arvuta():\r\na = str(float(meetrid.get())\/1000)\r\nkilomeetrid.config(text = a)\r\n\r\nraam = Tk()\r\nraam.title(\"Meetrite teisendamine\")\r\n\r\nmeetrid = ttk.Entry(raam, width=7)\r\nmeetrid.grid(column=2, row=1, sticky=E, padx=5, pady=5)\r\n\r\nkilomeetrid = ttk.Label(raam)\r\nkilomeetrid.grid(column=2, row=2, sticky=E, padx=5, pady=5)\r\n\r\nttk.Button(raam, text=\"Arvuta!\", command = arvuta).grid(column=3, row=3, sticky=W, padx=5, pady=5)\r\n\r\nttk.Label(raam, text=\"meetrit\").grid(column=3, row=1, sticky=W, padx=5, pady=5)\r\nttk.Label(raam, text=\"on v\u00f5rdne\").grid(column=1, row=2, sticky=E, padx=5, pady=5)\r\nttk.Label(raam, text=\"kilomeetriga.\").grid(column=3, row=2, sticky=W, padx=5, pady=5)\r\n\r\nraam.mainloop()<\/pre>\r\nT\u00f6\u00f6tav teisendusprogramm peaks olema lisatud vahedega selline:\r\n\r\n<img class=\"alignnone size-full wp-image-478\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_7.png\" alt=\"\" width=\"298\" height=\"158\" \/>\r\n<h1>Tkinteri raam raamis<\/h1>\r\nSageli on kasutajaliidesed veelgi keerulisemad ja koosnevad mitmest sektsioonist. Raami sisse saab lisada omakorda v\u00e4iksemaid raame, kuhu paigutada komponente. Vaatame ka n\u00e4idet, kus raami sisse on omakorda paigutatud sisuraam elementidega. Pange t\u00e4hele, kuidas on sisuraam lisatud omakorda raami!\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from tkinter import * # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk # platvormi \u00fchise stiili saamiseks\r\ndef arvuta():\r\na = str(float(meetrid.get())\/1000)\r\nkilomeetrid.config(text = a)\r\n\r\nraam = Tk()\r\nraam.title(\"Meetrite teisendamine\")\r\n\r\nsisuraam = ttk.Frame(raam, padding=\"3 3 12 12\")\r\nsisuraam.grid(column=0, row=0, sticky=(N, W, E, S))\r\nraam.columnconfigure(0, weight=1)\r\nraam.rowconfigure(0, weight=1)\r\n\r\nmeetrid = ttk.Entry(sisuraam, width=7)\r\nmeetrid.grid(column=2, row=1, sticky=(W, E), padx=5, pady=5)\r\n\r\nkilomeetrid = ttk.Label(sisuraam)\r\nkilomeetrid.grid(column=2, row=2, sticky=(W, E), padx=5, pady=5)\r\nttk.Button(sisuraam, text=\"Arvuta!\", command = arvuta).grid(column=3, row=3, sticky=W, padx=5, pady=5)\r\n\r\nttk.Label(sisuraam, text=\"meetrit\").grid(column=3, row=1, sticky=W, padx=5, pady=5)\r\nttk.Label(sisuraam, text=\"on v\u00f5rdne\").grid(column=1, row=2, sticky=E, padx=5, pady=5)\r\nttk.Label(sisuraam, text=\"kilomeetriga.\").grid(column=3, row=2, sticky=W, padx=5, pady=5)\r\n\r\nraam.mainloop()\r\n<\/pre>\r\nMainisime, et raami sisse saab ka lisada mitu v\u00e4iksemat raami. Kui on soov n\u00e4iteks raami lisada sisuraami alla jaluseraam, siis saab seda teha n\u00e4iteks enne mainloopi k\u00e4sku selliselt:\r\n\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">jaluseraam = ttk.Frame(raam, padding=\"5 5 12 12\", borderwidth = 2, relief = \"sunken\")<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">jaluseraam.grid(column=0, row=1, sticky=(E,W))<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ttk.Button(jaluseraam, text=\"Sulge\").grid(column=0, row=0, sticky = E)<\/code>\r\n\r\nRaamile saab ka lisada serva parameetritega borderwidth = 2 ja relief = \u201csunken\u201d v\u00f5i \u201craised\u201d.\r\n\r\nN\u00fc\u00fcd j\u00e4\u00e4b \u00fcle vaid lisada ka sulgemise nupule sulgemise funktsionaalsus \u201ccommand = sulgeprogramm\u201d ja lisada programmi algusesse ka vastava funktsiooni:\r\n\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def sulgeprogramm():<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">raam.destroy()<\/code>\r\n\r\nJaluseraami lisandumisel peaks tulemus olema selline:\r\n\r\n<img class=\"alignnone size-full wp-image-479\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_8.png\" alt=\"\" width=\"313\" height=\"216\" \/>\r\n<h1>Tkinter t\u00e4iustatud n\u00e4ide raam raamis<\/h1>\r\nLisaks eelnevale tutvustame paari nippi, kuidas lahendada j\u00e4rgnevaid probleemk\u00fcsimusi:\r\n<ul>\r\n \t<li>Kuidas kontrollida, kas on tekstisisestuskasti on sisestatud arv?<\/li>\r\n<\/ul>\r\nTekstisisestuskasti sisestatud s\u00f5ne kontrollimiseks on mugav kasutada try ja except plokki. Siin programmis saab try-k\u00e4suga proovida, kas sisestatud s\u00f5ne on v\u00f5imalik teisendada arvuks, et teha soovitud arvutusi. Seda saab teha selliselt:\r\n\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">try:<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 a = float(meetrid.get())<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 kilomeetrid.set(a \/ 1000)<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 meetrid.set(\"\")<\/code>\r\n\r\nMis aga juhtub siis, kui kasutaja tr\u00fckib ebasobiva s\u00f5ne ja tekib s\u00f5ne teisendamisel arvuks veateade? Selleks tuleb lisada ka except osa, mis p\u00fc\u00fcab kinni tekkinud veateated. Praegusel juhul siis p\u00fc\u00fctakse kinni veateate ValueError teke:\r\n\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">except ValueError:<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 kilomeetrid.set(\"Ei saanud teisendada. Sisesta arv!\")<\/code>\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 meetrid.set(\"\")<\/code>\r\n<ul>\r\n \t<li>Kuidas kasutada programmis jooksvalt s\u00f5ne t\u00fc\u00fcpi muutujaid?<\/li>\r\n<\/ul>\r\nSelleks, et programmis jooksvalt kasutada erinevaid s\u00f5ne t\u00fc\u00fcpi muutujaid, kuhu saaks tekstisisestuskasti tr\u00fckitud v\u00e4\u00e4rtusi salvestada, saame defineerida vastava muutuja k\u00e4sklusega kilomeetrid = StringVar(). N\u00fc\u00fcd saab mugavalt tekstisildil kasutada kuvatava v\u00e4\u00e4rtusena kilomeetreid \u201ctextvariable=kilomeetrid\u201d ja vastavat teksti tekstisildil muuta k\u00e4sklusega kilomeetrid.set().\r\n<ul>\r\n \t<li>Kuidas komponentide omadusi korraga muuta?<\/li>\r\n<\/ul>\r\nN\u00e4eme, et k\u00f5igi komponentide \u00fcmber on m\u00e4\u00e4ratud viiepiksline vaba ruum parameetritega padx ja pady. Kuidas saaks mugavalt muuta k\u00f5igi komponentide \u00fcmber olevat ruumi? Selleks saame appi v\u00f5tta ts\u00fckli k\u00f5igi sisuraami laste (ingl child) ehk sisuraamis olevate komponentide parameetrite muutmiseks:\r\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">for child in sisuraam.winfo_children(): child.grid_configure(padx=5, pady=5)<\/code>\r\n<ul>\r\n \t<li>Kuidas saaks programmi k\u00e4ivitamisel koheselt aktiveerida tekstisisestuskasti?<\/li>\r\n<\/ul>\r\nKui programmis on mitmeid tekstisisestuskaste, siis saab ka m\u00e4\u00e4rata, millisesse tekstisisestuskasti vaikimisi tr\u00fckkida saab. Selleks tuleks seada fookus tekstisisestuskastile k\u00e4sklusega focus(). N\u00e4iteks: meetrite_tekstikast.focus()\r\n\r\nNende nippide abil saame eelnevat programmi kohendades allj\u00e4rgneva programmi:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from tkinter import * # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk # platvormi \u00fchise stiili saamiseks\r\ndef teisenda(*args):\r\n    try:\r\n        a = float(meetrid.get())\r\n        kilomeetrid.set(a \/ 1000)\r\n        meetrid.set(\"\")\r\n    except ValueError:\r\n        kilomeetrid.set(\"Ei saanud teisendada. Sisesta arv!\")\r\n        meetrid.set(\"\")\r\n\r\nraam = Tk()\r\nraam.title(\"Meetrite teisendamine\")\r\n\r\nsisuraam = ttk.Frame(raam, padding=\"3 3 12 12\")\r\nsisuraam.grid(column=0, row=0, sticky=(N, W, E, S))\r\nraam.columnconfigure(0, weight=1)\r\nraam.rowconfigure(0, weight=1)\r\n\r\nmeetrid = StringVar()\r\nkilomeetrid = StringVar()\r\n\r\nmeetrite_tekstikast = ttk.Entry(sisuraam, width=7, textvariable=meetrid)\r\nmeetrite_tekstikast.grid(column=2, row=1, sticky=(W, E))\r\n\r\nttk.Label(sisuraam, textvariable=kilomeetrid).grid(column=2, row=2, sticky=(W, E))\r\nttk.Button(sisuraam, text=\"Arvuta!\", command=teisenda).grid(column=3, row=3, sticky=W)\r\n\r\nttk.Label(sisuraam, text=\"meetrit\").grid(column=3, row=1, sticky=W)\r\nttk.Label(sisuraam, text=\"on v\u00f5rdne\").grid(column=1, row=2, sticky=E)\r\nttk.Label(sisuraam, text=\"kilomeetriga.\").grid(column=3, row=2, sticky=W)\r\n\r\nfor child in sisuraam.winfo_children(): child.grid_configure(padx=5, pady=5)\r\n\r\nmeetrite_tekstikast.focus()\r\nraam.bind('&lt;Return&gt;', teisenda)\r\n\r\nraam.mainloop()<\/pre>\r\n&nbsp;","rendered":"<p>T\u00e4iendame n\u00fc\u00fcd eelmist programmi veelgi. Kohendame v\u00e4limust selliselt, et:<\/p>\n<ol>\n<li>Lisame funktsiooni arvuta, mis k\u00e4ivitatakse nupule vajutades. Selleks tuleb nupule lisada parameeter \u201ccommand = arvuta\u201d ja luua vastav funktsioon arvuta(), kus v\u00f5etakse meetrite tekstisisestuskastist meetrid, teisendatakse tulemus kilomeetriteks ning v\u00e4ljastatakse kasutajaliideses olevale tekstisildile kilomeetriteks teisendatud tulemus.<\/li>\n<li>Lisame tekstisiltidele joonduse <strong>N<\/strong>, <strong>S<\/strong>, <strong>E<\/strong>, <strong>W<\/strong>, mis joondavad teksti vastavalt ilmakaarele. N\u00e4iteks E (east) on paremjoondus ja W (west) on vasakjoondus.<\/li>\n<li>Viimase asjana lisame komponentide \u00fcmber vaba ruumi \u00e4\u00e4rtesse parameetriga padx ja \u00fcles ning alla parameetriga pady.<\/li>\n<\/ol>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from tkinter import *\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0 # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk\u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0 # platvormi \u00fchise stiili saamiseks\r\ndef arvuta():\r\na = str(float(meetrid.get())\/1000)\r\nkilomeetrid.config(text = a)\r\n\r\nraam = Tk()\r\nraam.title(\"Meetrite teisendamine\")\r\n\r\nmeetrid = ttk.Entry(raam, width=7)\r\nmeetrid.grid(column=2, row=1, sticky=E, padx=5, pady=5)\r\n\r\nkilomeetrid = ttk.Label(raam)\r\nkilomeetrid.grid(column=2, row=2, sticky=E, padx=5, pady=5)\r\n\r\nttk.Button(raam, text=\"Arvuta!\", command = arvuta).grid(column=3, row=3, sticky=W, padx=5, pady=5)\r\n\r\nttk.Label(raam, text=\"meetrit\").grid(column=3, row=1, sticky=W, padx=5, pady=5)\r\nttk.Label(raam, text=\"on v\u00f5rdne\").grid(column=1, row=2, sticky=E, padx=5, pady=5)\r\nttk.Label(raam, text=\"kilomeetriga.\").grid(column=3, row=2, sticky=W, padx=5, pady=5)\r\n\r\nraam.mainloop()<\/pre>\n<p>T\u00f6\u00f6tav teisendusprogramm peaks olema lisatud vahedega selline:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-478\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_7.png\" alt=\"\" width=\"298\" height=\"158\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_7.png 298w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_7-65x34.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_7-225x119.png 225w\" sizes=\"auto, (max-width: 298px) 100vw, 298px\" \/><\/p>\n<h1>Tkinteri raam raamis<\/h1>\n<p>Sageli on kasutajaliidesed veelgi keerulisemad ja koosnevad mitmest sektsioonist. Raami sisse saab lisada omakorda v\u00e4iksemaid raame, kuhu paigutada komponente. Vaatame ka n\u00e4idet, kus raami sisse on omakorda paigutatud sisuraam elementidega. Pange t\u00e4hele, kuidas on sisuraam lisatud omakorda raami!<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from tkinter import * # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk # platvormi \u00fchise stiili saamiseks\r\ndef arvuta():\r\na = str(float(meetrid.get())\/1000)\r\nkilomeetrid.config(text = a)\r\n\r\nraam = Tk()\r\nraam.title(\"Meetrite teisendamine\")\r\n\r\nsisuraam = ttk.Frame(raam, padding=\"3 3 12 12\")\r\nsisuraam.grid(column=0, row=0, sticky=(N, W, E, S))\r\nraam.columnconfigure(0, weight=1)\r\nraam.rowconfigure(0, weight=1)\r\n\r\nmeetrid = ttk.Entry(sisuraam, width=7)\r\nmeetrid.grid(column=2, row=1, sticky=(W, E), padx=5, pady=5)\r\n\r\nkilomeetrid = ttk.Label(sisuraam)\r\nkilomeetrid.grid(column=2, row=2, sticky=(W, E), padx=5, pady=5)\r\nttk.Button(sisuraam, text=\"Arvuta!\", command = arvuta).grid(column=3, row=3, sticky=W, padx=5, pady=5)\r\n\r\nttk.Label(sisuraam, text=\"meetrit\").grid(column=3, row=1, sticky=W, padx=5, pady=5)\r\nttk.Label(sisuraam, text=\"on v\u00f5rdne\").grid(column=1, row=2, sticky=E, padx=5, pady=5)\r\nttk.Label(sisuraam, text=\"kilomeetriga.\").grid(column=3, row=2, sticky=W, padx=5, pady=5)\r\n\r\nraam.mainloop()\r\n<\/pre>\n<p>Mainisime, et raami sisse saab ka lisada mitu v\u00e4iksemat raami. Kui on soov n\u00e4iteks raami lisada sisuraami alla jaluseraam, siis saab seda teha n\u00e4iteks enne mainloopi k\u00e4sku selliselt:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">jaluseraam = ttk.Frame(raam, padding=\"5 5 12 12\", borderwidth = 2, relief = \"sunken\")<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">jaluseraam.grid(column=0, row=1, sticky=(E,W))<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ttk.Button(jaluseraam, text=\"Sulge\").grid(column=0, row=0, sticky = E)<\/code><\/p>\n<p>Raamile saab ka lisada serva parameetritega borderwidth = 2 ja relief = \u201csunken\u201d v\u00f5i \u201craised\u201d.<\/p>\n<p>N\u00fc\u00fcd j\u00e4\u00e4b \u00fcle vaid lisada ka sulgemise nupule sulgemise funktsionaalsus \u201ccommand = sulgeprogramm\u201d ja lisada programmi algusesse ka vastava funktsiooni:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def sulgeprogramm():<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">raam.destroy()<\/code><\/p>\n<p>Jaluseraami lisandumisel peaks tulemus olema selline:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-479\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_8.png\" alt=\"\" width=\"313\" height=\"216\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_8.png 313w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_8-300x207.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_8-65x45.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/11\/2_8-225x155.png 225w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/p>\n<h1>Tkinter t\u00e4iustatud n\u00e4ide raam raamis<\/h1>\n<p>Lisaks eelnevale tutvustame paari nippi, kuidas lahendada j\u00e4rgnevaid probleemk\u00fcsimusi:<\/p>\n<ul>\n<li>Kuidas kontrollida, kas on tekstisisestuskasti on sisestatud arv?<\/li>\n<\/ul>\n<p>Tekstisisestuskasti sisestatud s\u00f5ne kontrollimiseks on mugav kasutada try ja except plokki. Siin programmis saab try-k\u00e4suga proovida, kas sisestatud s\u00f5ne on v\u00f5imalik teisendada arvuks, et teha soovitud arvutusi. Seda saab teha selliselt:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">try:<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 a = float(meetrid.get())<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 kilomeetrid.set(a \/ 1000)<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 meetrid.set(\"\")<\/code><\/p>\n<p>Mis aga juhtub siis, kui kasutaja tr\u00fckib ebasobiva s\u00f5ne ja tekib s\u00f5ne teisendamisel arvuks veateade? Selleks tuleb lisada ka except osa, mis p\u00fc\u00fcab kinni tekkinud veateated. Praegusel juhul siis p\u00fc\u00fctakse kinni veateate ValueError teke:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">except ValueError:<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 kilomeetrid.set(\"Ei saanud teisendada. Sisesta arv!\")<\/code><br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">\u00a0\u00a0\u00a0 meetrid.set(\"\")<\/code><\/p>\n<ul>\n<li>Kuidas kasutada programmis jooksvalt s\u00f5ne t\u00fc\u00fcpi muutujaid?<\/li>\n<\/ul>\n<p>Selleks, et programmis jooksvalt kasutada erinevaid s\u00f5ne t\u00fc\u00fcpi muutujaid, kuhu saaks tekstisisestuskasti tr\u00fckitud v\u00e4\u00e4rtusi salvestada, saame defineerida vastava muutuja k\u00e4sklusega kilomeetrid = StringVar(). N\u00fc\u00fcd saab mugavalt tekstisildil kasutada kuvatava v\u00e4\u00e4rtusena kilomeetreid \u201ctextvariable=kilomeetrid\u201d ja vastavat teksti tekstisildil muuta k\u00e4sklusega kilomeetrid.set().<\/p>\n<ul>\n<li>Kuidas komponentide omadusi korraga muuta?<\/li>\n<\/ul>\n<p>N\u00e4eme, et k\u00f5igi komponentide \u00fcmber on m\u00e4\u00e4ratud viiepiksline vaba ruum parameetritega padx ja pady. Kuidas saaks mugavalt muuta k\u00f5igi komponentide \u00fcmber olevat ruumi? Selleks saame appi v\u00f5tta ts\u00fckli k\u00f5igi sisuraami laste (ingl child) ehk sisuraamis olevate komponentide parameetrite muutmiseks:<br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">for child in sisuraam.winfo_children(): child.grid_configure(padx=5, pady=5)<\/code><\/p>\n<ul>\n<li>Kuidas saaks programmi k\u00e4ivitamisel koheselt aktiveerida tekstisisestuskasti?<\/li>\n<\/ul>\n<p>Kui programmis on mitmeid tekstisisestuskaste, siis saab ka m\u00e4\u00e4rata, millisesse tekstisisestuskasti vaikimisi tr\u00fckkida saab. Selleks tuleks seada fookus tekstisisestuskastile k\u00e4sklusega focus(). N\u00e4iteks: meetrite_tekstikast.focus()<\/p>\n<p>Nende nippide abil saame eelnevat programmi kohendades allj\u00e4rgneva programmi:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from tkinter import * # tkinteri p\u00f5hivahendid\r\nfrom tkinter import ttk # platvormi \u00fchise stiili saamiseks\r\ndef teisenda(*args):\r\n    try:\r\n        a = float(meetrid.get())\r\n        kilomeetrid.set(a \/ 1000)\r\n        meetrid.set(\"\")\r\n    except ValueError:\r\n        kilomeetrid.set(\"Ei saanud teisendada. Sisesta arv!\")\r\n        meetrid.set(\"\")\r\n\r\nraam = Tk()\r\nraam.title(\"Meetrite teisendamine\")\r\n\r\nsisuraam = ttk.Frame(raam, padding=\"3 3 12 12\")\r\nsisuraam.grid(column=0, row=0, sticky=(N, W, E, S))\r\nraam.columnconfigure(0, weight=1)\r\nraam.rowconfigure(0, weight=1)\r\n\r\nmeetrid = StringVar()\r\nkilomeetrid = StringVar()\r\n\r\nmeetrite_tekstikast = ttk.Entry(sisuraam, width=7, textvariable=meetrid)\r\nmeetrite_tekstikast.grid(column=2, row=1, sticky=(W, E))\r\n\r\nttk.Label(sisuraam, textvariable=kilomeetrid).grid(column=2, row=2, sticky=(W, E))\r\nttk.Button(sisuraam, text=\"Arvuta!\", command=teisenda).grid(column=3, row=3, sticky=W)\r\n\r\nttk.Label(sisuraam, text=\"meetrit\").grid(column=3, row=1, sticky=W)\r\nttk.Label(sisuraam, text=\"on v\u00f5rdne\").grid(column=1, row=2, sticky=E)\r\nttk.Label(sisuraam, text=\"kilomeetriga.\").grid(column=3, row=2, sticky=W)\r\n\r\nfor child in sisuraam.winfo_children(): child.grid_configure(padx=5, pady=5)\r\n\r\nmeetrite_tekstikast.focus()\r\nraam.bind('&lt;Return&gt;', teisenda)\r\n\r\nraam.mainloop()<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"author":17,"menu_order":8,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-121","chapter","type-chapter","status-publish","hentry"],"part":451,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/users\/17"}],"version-history":[{"count":12,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/121\/revisions"}],"predecessor-version":[{"id":639,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/121\/revisions\/639"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/parts\/451"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/121\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/media?parent=121"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapter-type?post=121"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/contributor?post=121"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/license?post=121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}