2020. szeptember 17., csütörtök

Tkinter grafikus könyvtár használata


A program elemzése: 

Könnyű olyan Python modulokat létrehozni, amik scripteket, függvénydefiníciókat, objektumosztályokat, stb. tartalmaznak. Ezeket a modulokat vagy teljes egészükben, vagy részben bármely programba importálhatjuk. Ezt tesszük példánk elsĘ sorában : a from Tkinter import * importálja a Tkinter modulban lévĘ valamennyi osztályt. Egyre gyakrabban kell osztályokról (class-okról) beszélnünk. A programozásban így nevezzük az objektum generátorokat, amik újra felhasználható programrészletek. Példánk második sorában : ablak1 = Tk() a Tkinter modul Tk() osztályát használjuk és annak egy példányát (egy objektumát) hozzuk létre az ablak1 -et.

Számológép készítése

Készítsük el az itt látható ablakot! 
Az ablak négy alapmĦveletes számológépként mĦködjön!

 # -*- coding: ISO-8859-2 -*- from Tkinter import * def osszead(): x = eval(mezo1.get()) y = eval(mezo2.get()) z = x + y mezo3.delete(0,END) mezo3.insert(0,'Eredmény: '+str(z)) def kivon(): x = eval(mezo1.get()) y = eval(mezo2.get()) z = x - y mezo3.delete(0,END) mezo3.insert(0,'Eredmény: '+str(z))
def szoroz(): x = eval(mezo1.get()) y = eval(mezo2.get()) z = x * y mezo3.delete(0,END) mezo3.insert(0,'Eredmény: '+str(z)) def oszt(): x = eval(mezo1.get()) y = eval(mezo2.get()) z = x / y mezo3.delete(0,END) mezo3.insert(0,'Eredmény: '+str(z)) ablak1 = Tk() mezo1 = Entry(ablak1) mezo1.pack() mezo2 = Entry(ablak1) mezo2.pack() gomb1 = Button(ablak1, text='Összeadás', command=osszead) gomb1.pack() gomb2 = Button(ablak1, text='Kivonás', command=kivon) gomb2.pack() gomb3 = Button(ablak1, text='Szorzás', command=szoroz) gomb3.pack() gomb4 = Button(ablak1, text='Osztás', command=oszt) gomb4.pack() mezo3 = Entry(ablak1) mezo3.pack() gomb5 = Button(ablak1, text='Kilépés', command = ablak1.destroy) gomb5.pack() ablak1.mainloop()

A Tkinter widget-osztályai

Apránként meg fogunk ismerkedni néhány widget használatával. Azokra a widget-ekre
fogunk szorítkozni, amelyek módszertani szempontból a legérdekesebbnek tĦnnek
A Tkinter widget-eknek 15 alaposztálya létezik :
Button Klasszikus nyomógomb, valamilyen utasítás végrehajtásának az elĘidézésére
használják.
Canvas KülönbözĘ grafikus elemek elhelyezésére szolgáló felület. Rajzolásra, grafikus
szerkesztĘk létrehozására és testre szabott widget-ek implementálására is
használhatjuk.
Checkbutton Egy jelölĘnégyzet, aminek két különbözĘ állapota lehet (a négyzet ki van jelölve
vagy nincs kijelölve). Egy klikkelés a widgeten állapotváltozást idéz elĘ.
Entry Adatbeviteli mezĘ, amibe a felhasználó bármilyen szöveget beírhat.

Frame 

Egy téglalap alakú felület az ablakban, ahova más widget-eket tehetünk. Ez a
felület színes lehet. Szegélye is lehet.
Label Valamilyen szöveg (vagy címke) (esetleg egy kép).
Listbox A felhasználónak - általában valamilyen doboz formájában - felajánlott
választéklista. A Listbox-ot úgy is konfigurálhatjuk, hogy vagy egy rádiógomb
vagy egy jelölĘnégyzet sorozatot tartalmazzon.
Menu Menü. Lehet címsorhoz kapcsolódó legördülĘ menü, vagy egy kattintás után
akárhol feljövĘ úszó popup menü.
Menubutton Menügomb, amit legördülĘ menük implementálására használnak.
Message Szöveg kiírását teszi lehetĘvé. A Label widget egy változata, ami lehetĘvé teszi,
hogy a kiírt szöveg automatikusan egy bizonyos mérethez, vagy
szélesség/magasság arányhoz igazodjon.
Radiobutton (Egy fekete pont egy kis körben.) Egy változó lehetséges értékeit reprezentálja.
Az egyik rádiógombra való kattintás az annak megfelelĘ értéket adja a
változónak.

Scale 

Egy kurzornak egy skála mentén való mozgatásával teszi láthatóvá egy változó
értékének a változtatását.
Scrollbar A görgetĘ sort más widget-ekhez (Canvas, Entry, Listbox, Text) kapcsolva
használhatjuk.
Text Formázott szöveg kiírása. A felhasználónak is lehetĘvé teszi a kiírt szöveg
formázását. Képeket is be lehet szúrni.
Toplevel Egy külön, felülre kiírt ablak.
Mindegyik widget-osztály-nak számos beépített metódusa van. Kapcsolhatunk hozzájuk
eseményeket is, amint azt az elĘ]Ę oldalakon láttuk. Többek között meg fogjuk tanulni, hogy
ezeket a widget-eket a grid(), a pack() és a place() metódusok segítségével pozícionálhatjuk
az ablakokban.
Ezeknek a módszereknek a haszna akkor válik nyilvánvalóvá, amikor megpróbálunk
portábilis programokat írni (vagyis olyanokat, amik képesek különbözĘ operációs
rendszereken – mint a Unix, MacOS vagy Windows - futni), amiknek az ablakai
átméretezhetĘek.



A grid() metódus alkalmazása widget-ek
pozícionálására
Eddig mindig a pack() metódus segítségével helyeztük el a widget-eket az ablakukban.
Ennek a metódusnak a rendkívüli egyszerĦség az elĘnye, azonban nem ad túl sok szabadságot
a widget-ek kedvünk szerinti elrendezéséhez.

Feladat – Mintaablak2

Készítsük el az itt látható ablakot!

# -*- coding: ISO-8859-2 -*-
from Tkinter import *
abl1 = Tk()
txt1 = Label(abl1, text = 'ElsĘ mezĘ :')
txt2 = Label(abl1, text = 'Második :')
mezo1 = Entry(abl1)
mezo2 = Entry(abl1)
txt1.pack(side =LEFT)
txt2.pack(side =LEFT)
mezo1.pack(side =LEFT)
mezo2.pack(side =LEFT)
abl1.mainloop()

Tkinter segítségével Pythonban írt alkalmazásainknak könnyedén varázsolhatunk egyszerûen kezelhetõ grafikus felületet, mely – a Pythonnak köszönhetõen –nemcsak Linux alatt, de Windowson vagy bármely Python által támogatott felületen elérhetõ, és a már megírt kód változtatás nélkül bárhol lefut. Mindemellett az egyes felületeken programjaink is egységesen néznek ki, eltekintve a betûtípusok miatt kialakuló különbségektõl. A Tkinter a grafikus felületek elkészítéséhez a Tcl/Tk-t hívja segítségül. Mint a legtöbb Python-bõvítmény, a Tcl/Tk-hoz kapcsolódó Tkinter is C-alapokra épül. Megvalósítási szinten a Tkinter két rétegre bontható: a C-ben írt _tkinter programkönyvtárra, valamint a már  pythonban írt Tkinter.py-re és az ehhez kapcsolódó egyéb Python modulokra. A _tkinter kapcsolja
össze a Python-modulokat a Tcl/Tkval, de a programozó elõl ezt a réteget teljesen elrejti a Python.py,
azaz az egyetlen olyan modul, melyet a tkinteres alkalmazásaink fejlesztéséhez valóban ismernünk kell.
A Tkinter felépítése A Tkinter felépítése, ellentétben egyéb GUI-rendszerek osztályrendszereivel, nagyon egyszerû. A szerkezetben a GUI-elemek egy úgynevezett alapelemre (basewidget) épülnek, amelyhez az elemek elhelyezéséért felelõs osztályok (Pack, Place és Grid), illetve a Tkinter mûködését befolyásoló egyéb osztályok Mixinként kapcsolódnak (lásd alább). A Tkinter használata Elõször is készítsük el a már jól ismert „Szia Világ!” program tkinteres változatát (1. lista). A program legelsõ sorában a Tkinterbõl használt elemeket vezetjük be a from Tkinter import Label, mainloop paranccsal. Ha korábban már foglalkoztál Pythonnal, különösnek tûnhet ez a sor. Vajon miért használjuk a from modulneve import írásmódot a már jól bevált import modulneve helyett? Nos, képzeljük csak el,
milyen fárasztó lenne, ha a programunkban minden Tkinterelemre hivatkozáskor be kellene írogatnunk, hogy az adott elem mely modulból származik. Mivel azonban a programozók kényelmes emberek, egyszerûbb megoldást találtak ki helyette, amely az adott modul névterébõl minden elemet saját programunk névterébe emel át. Bánjunk vele nagyon óvatosan, mert ezáltal minden modul minden tagfüggvénye (method) egy névtérbe kerül, és elõfordulhat, hogy egy azonos nevû, bár más feladatú tagfüggvény több modulban is megtalálható, így semmiképpen sem ajánlott több modul hasonló elvû beillesztése. Lépjünk tovább a második sorra! Ebben nincsen különösebb magyarázatra szoruló rész. A Label-lel címkét hozunk létre, benne a jól ismert szöveggel, majd a címke pack() tagfüggvényével az elemet alkalmazásunk ablakába helyezzük. Az utolsó sorban a vezérlést a felhasználónak adjuk át. A mainloop() a felhasználó és a rendszer által keltett eseményeket dolgozza fel, pontosabban ez a szolgáltatás az esetleges billentyûleütéseket „csípi el”, illetve az õ dolga az is, hogy elemeinket újrarajzolja, ha azok elõzõleg valamilyen okból takarásba kerültek. Egy fejlettebb program Mint elõzõ példánkban láttuk, pillanatok alatt létrehozhatunk olyan programot, mely a felhasználó számára adatot közöl. Igen ám, de mi történik olyankor, amikor a felhasználót nemcsak tájékoztatni szeretnénk valamirõl, hanem a véleményére is kíváncsiak vagyunk? Példánkban programunkat egy gombbal bõvítjük ki, amelyre kattintva megváltoztathatjuk az ablakban megjelenõ szöveget . Ez a program már valamivel bonyolultabb. A legfontosabb különbség, hogy ezúttal egy osztályt hoztunk létre, melynek __init__() eljárása az objektum megalkotása után önmûködõen meghívódik, s az ablakunkat, illetve az abban megjelenõ gombot ez az __init__() eljárás hozza létre. A gombon kezdetben a megszokott „Szia Világ!” szöveg található, majd ha rákattintunk, programunk Guidó-nak, a Python megalkotójának köszön. A program legelsõ sorában bevezetjük a Tkinter-modul összes elemét. Ezt követõen a futás a 13. sorra ugrik, ahol azt vizsgáljuk, vajon mi is csak egy modul vagyunk-e vagy pedig önálló programként futunk. Ha önállóak vagyunk, osztályunkat létrehozva annak mainloop() eljárását nekünk kell meghívnunk. A mainloop()-ot ebben az esetben a Fra me-osztálytól örököljük – errõl nem elfeledkezve hívjuk meg szülõosztályunk __init__() eljárását is (még a mainloop() elõtt). A 7. sorban egy gombot hozunk létre, és az ezt követõ két sorban ennek  ulajdonságait módosítjuk, végül a pack() eljárással életre is keltjük. A 9. sorban azt állítjuk be, mi történjen, amikor valaki a gombunkra kattint. Esetünkben ilyenkor osztályunk hello_callback() eljárása hívódik meg. Ez az eljárás – talán már feltûnt – a programból közvetlenül sehol sem hívódik meg, e feladatot a mainloop()-ra bízták. Ha valaki a gombon kattint, egy esemény keletkezik, amelyet a mainloop() kap el, és az adott elemhez tartozó command tulajdonságból kiemeli, milyen eljárást kell ilyenkor hívnia. Fontos tehát, hogy lássuk: az __init__() eljárás még a mainloop() elõtt hajtódik végre, a hello_callback() eljárást viszont már a mainloop() hívja meg. 

http://hu.dumkakvit.com/symbol/hu.python_1.html

http://szerver2.lacszki.sulinet.hu/tananyag/informatika/tkinter.pdf

Nincsenek megjegyzések:

Megjegyzés küldése