Uuri Tkinterit, Pythoni standardset GUI teeki, ja õpi looma platvormiüleseid töölauarakendusi. Juhend katab vidinad, paigutused, sündmuste käsitluse ja tavad.
Pythoni töölauarakendused: põhjalik juhend Tkinteri graafilise kasutajaliidese arendamiseks
Python on tuntud oma mitmekülgsuse poolest, leidmaks rakendusi veebiarenduses, andmeteaduses ja skriptimises. Kuid kas teadsite, et seda saab kasutada ka köitvate töölauarakenduste loomiseks? Tkinter, Pythoni standardne GUI (graafiline kasutajaliides) teek, pakub lihtsat, kuid võimsat viisi platvormiüleste töölauarakenduste loomiseks. See juhend viib teid läbi Tkinteri põhitõdede, varustades teid teadmistega oma Pythonil põhinevate töölauarakenduste loomiseks.
Miks Tkinter?
Enne detailidesse süvenemist mõistame, miks Tkinter on endiselt populaarne valik Pythoni GUI arendamiseks:
- Osa Pythoni standardteegist: Tkinter on enamiku Pythoni distributsioonidega eelinstalleeritud, mis välistab vajaduse väliste installatsioonide järele ja lihtsustab projekti seadistamist.
- Platvormiülene ühilduvus: Tkinteri rakendused töötavad sujuvalt Windowsis, macOS-is ja Linuxis, muutes selle suurepäraseks valikuks laia levialaga rakenduste arendamiseks.
- Lihtne õppida: Tkinteri suhteliselt lihtne API muudab selle kättesaadavaks algajatele, pakkudes samas piisavalt paindlikkust keerukamate projektide jaoks.
- Suur kogukond ja ressursid: Ulatuslik veebikogukond pakub Tkinteri arendajatele ohtralt dokumentatsiooni, õpetusi ja tuge.
- Kiire prototüüpimine: Tkinter võimaldab GUI rakenduste kiiret arendamist ja prototüüpimist.
Tkinteriga alustamine
Tkinteri rakenduste loomise alustamiseks on vaja, et teie süsteemi oleks installitud Python. Enamikul operatsioonisüsteemidel on Python eelinstalleeritud, kuid soovitatav on alla laadida uusim versioon ametlikult Pythoni veebisaidilt (python.org), et tagada teile kõige ajakohasemad funktsioonid ja turvapaigad.
Põhiakna loomine
Alustame lihtsa akna loomisest. See on iga Tkinteri rakenduse alus.
import tkinter as tk
# Loo peaaken
root = tk.Tk()
# Määra akna pealkiri
root.title("Minu esimene Tkinteri rakendus")
# Määra akna suurus (laiusxkõrgus)
root.geometry("400x300")
# Käivita peamine sündmuste tsükkel
root.mainloop()
Selgitus:
- `import tkinter as tk`: Impordib Tkinteri mooduli ja annab sellele lühiduse huvides aliase `tk`.
- `root = tk.Tk()`: Loob peaakna, mida sageli nimetatakse "juur" aknaks.
- `root.title("Minu esimene Tkinteri rakendus")`: Määrab akna pealkirja, mis kuvatakse akna tiitliribal.
- `root.geometry("400x300")`: Määrab akna algsuuruseks 400 pikslit laiaks ja 300 pikslit kõrgeks. Neid väärtusi saate vastavalt vajadusele reguleerida.
- `root.mainloop()`: Käivitab Tkinteri sündmuste tsükli, mis kuulab sündmusi (nt nupuklõpsud, klahvivajutused) ja hoiab akna avatuna, kuni kasutaja selle sulgeb. See on rakenduse interaktiivsuse jaoks ülioluline.
Salvestage see kood Pythoni failina (nt `my_app.py`) ja käivitage see. Peaksite nägema tühja akent pealkirjaga "Minu esimene Tkinteri rakendus".
Tkinteri vidinad: teie GUI ehitusplokid
Vidinad on üksikud elemendid, mis moodustavad teie GUI, näiteks nupud, sildid, tekstikastid ja palju muud. Tkinter pakub laia valikut vidinaid interaktiivsete rakenduste loomiseks.
Levinud Tkinteri vidinad
- Silt (Label): Kuvab staatilist teksti või pilte.
- Nupp (Button): Käivitab klõpsamisel toimingu.
- Sisestusväli (Entry): Võimaldab kasutajatel sisestada üherealist teksti.
- Tekstikast (Text): Võimaldab kasutajatel sisestada mitmerealist teksti.
- Raam (Frame): Toimib teiste vidinate konteinerina, aidates organisatsiooni ja paigutusega.
- Märkeruut (Checkbutton): Esindab loogilist valikut, mida saab sisse/välja lülitada.
- Valikunupp (Radiobutton): Võimaldab kasutajatel valida grupist ühe valiku.
- Loendikast (Listbox): Kuvab üksuste loendi, millest kasutaja saab valida.
- Kombokast (Combobox): Rippmenüü, mis võimaldab kasutajatel valida valiku eelmääratletud hulgast.
- Lõuend (Canvas): Pakub joonistuspinda kohandatud graafika ja visualiseerimiste loomiseks.
Vidinade lisamine aknasse
Vidinade lisamiseks aknasse peate looma vidinaklasside eksemplarid ja seejärel paigutama need aknasse paigutushaldurite abil (selgitatakse järgmises jaotises).
import tkinter as tk
root = tk.Tk()
root.title("Vidinade lisamine")
root.geometry("400x300")
# Loo siltvidin
label = tk.Label(root, text="Tere, Tkinter!")
# Loo nupuvidin
button = tk.Button(root, text="Kliki mind!")
# Loo sisestusväli
entry = tk.Entry(root)
# Paiguta vidinad aknasse
label.pack()
button.pack()
entry.pack()
root.mainloop()
Selgitus:
- `label = tk.Label(root, text="Tere, Tkinter!")`: Loob siltvidina tekstiga "Tere, Tkinter!" ja paigutab selle `root` aknasse.
- `button = tk.Button(root, text="Kliki mind!")`: Loob nupuvidina tekstiga "Kliki mind!" ja paigutab selle `root` aknasse.
- `entry = tk.Entry(root)`: Loob sisestusvälja vidina (tekstisisestusväli) ja paigutab selle `root` aknasse.
- `label.pack()`, `button.pack()`, `entry.pack()`: Kasutab `pack()` paigutushaldurit vidinate paigutamiseks aknasse. `pack()` haldur paigutab vidinad lihtsalt üksteise järel, kas vertikaalselt või horisontaalselt.
Paigutushaldurid: vidinade paigutamine teie GUI-s
Paigutushaldurid on olulised vidinate asukoha ja suuruse kontrollimiseks teie aknas. Tkinter pakub kolme peamist paigutushaldurit:
- `pack()`: Lihtsaim paigutushaldur, mis paigutab vidinad plokilaadselt, kas vertikaalselt või horisontaalselt.
- `grid()`: Paigutab vidinad ruudustikku (read ja veerud), võimaldades täpsemat paigutust.
- `place()`: Võimaldab määrata iga vidina täpsed koordinaadid (x, y) ja suuruse (laius, kõrgus), andes teile paigutuse üle kõige suurema kontrolli, kuid nõudes ka rohkem käsitsitööd.
`pack()` paigutushaldur
Nagu eelmises näites näidatud, on `pack()` kõige lihtsam paigutushaldur. See sobib lihtsate paigutuste jaoks, kus vidinaid saab paigutada otsekohesel viisil.
import tkinter as tk
root = tk.Tk()
root.title("Pack paigutus")
root.geometry("400x300")
label1 = tk.Label(root, text="Silt 1", bg="red")
label2 = tk.Label(root, text="Silt 2", bg="green")
label3 = tk.Label(root, text="Silt 3", bg="blue")
label1.pack(fill=tk.X)
label2.pack(side=tk.LEFT, fill=tk.Y)
label3.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
root.mainloop()
Selgitus:
- `fill=tk.X`: Paneb sildi täitma kogu akna laiuse piki X-telge.
- `side=tk.LEFT`: Paigutab sildi akna vasakule küljele.
- `fill=tk.Y`: Paneb sildi täitma kogu saadaoleva ruumi kõrguse piki Y-telge.
- `fill=tk.BOTH`: Paneb sildi täitma kogu saadaoleva ruumi nii X- kui ka Y-teljel.
- `expand=True`: Võimaldab sildil laieneda ja võtta enda alla kogu akna ülejäänud ruumi.
`grid()` paigutushaldur
`grid()` paigutushaldur pakub vidinate paigutamiseks struktureeritumat viisi. Saate määrata iga vidina rea ja veeru, luues ruudustiku-laadse paigutuse.
import tkinter as tk
root = tk.Tk()
root.title("Ruudustikupaigutus")
root.geometry("400x300")
label1 = tk.Label(root, text="Nimi:")
entry1 = tk.Entry(root)
label2 = tk.Label(root, text="E-post:")
entry2 = tk.Entry(root)
button = tk.Button(root, text="Esita")
label1.grid(row=0, column=0, sticky=tk.W)
entry1.grid(row=0, column=1)
label2.grid(row=1, column=0, sticky=tk.W)
entry2.grid(row=1, column=1)
button.grid(row=2, column=1, sticky=tk.E)
root.mainloop()
Selgitus:
- `row=0, column=0`: Paigutab vidina ruudustiku esimesse ritta ja esimesse veergu.
- `sticky=tk.W`: Joondab vidina oma lahtri lääne (vasakule) poole. Muud valikud hõlmavad `tk.E` (ida/parem), `tk.N` (põhi/ülemine), `tk.S` (lõuna/alumine) ja kombinatsioone nagu `tk.NW` (loode/vasak ülemine).
`place()` paigutushaldur
`place()` paigutushaldur annab teile kõige täpsema kontrolli vidina paigutuse üle, võimaldades määrata iga vidina täpsed x ja y koordinaadid ning laiuse ja kõrguse.
import tkinter as tk
root = tk.Tk()
root.title("Place paigutus")
root.geometry("400x300")
label = tk.Label(root, text="Täpne paigutus", bg="yellow")
button = tk.Button(root, text="Kliki siia", bg="lightgreen")
label.place(x=50, y=50, width=150, height=30)
button.place(x=200, y=100, width=100, height=40)
root.mainloop()
Selgitus:
- `x=50, y=50`: Paigutab vidina ülemise vasaku nurga koordinaatidele (50, 50) võrreldes akna ülemise vasaku nurgaga.
- `width=150, height=30`: Määrab vidina laiuseks 150 pikslit ja kõrguseks 30 pikslit.
Sündmuste käsitlemine: rakenduse interaktiivseks muutmine
Sündmuste käsitlemine on kasutaja interaktsioonidele reageerimise protsess, näiteks nupuklõpsud, klahvivajutused ja hiire liikumised. Tkinter kasutab sündmuste sidumisi vidinate ühendamiseks konkreetsete toimingutega.
Sündmuste sidumine vidinatega
Saate siduda sündmusi vidinatega, kasutades meetodit `bind()`. See meetod võtab kaks argumenti: sündmuse tüübi (nt `
import tkinter as tk
def button_clicked(event):
print("Nuppu vajutati!")
root = tk.Tk()
root.title("Sündmuste käsitlemine")
root.geometry("300x200")
button = tk.Button(root, text="Kliki mind")
button.bind("", button_clicked)
button.pack()
root.mainloop()
Selgitus:
- `def button_clicked(event):`: Määratleb funktsiooni, mida kutsutakse nupule klõpsamisel. Argument `event` sisaldab teavet sündmuse kohta.
- `button.bind("
", button_clicked)` : Seob vasaku hiireklõpsu sündmuse (``) funktsiooniga `button_clicked`.
Levinud sündmuste tüübid
- `
` : Vasak hiireklõps. - `
` : Keskmine hiireklõps. - `
` : Parem hiireklõps. - `
` : Mis tahes klahvivajutus. - `
` : Klahvi 'A' vajutamine. Asendage 'A' mis tahes muu klahviga. - `
` : Enter-klahvi vajutamine. - `
` : Vidin saab fookuse. - `
` : Vidin kaotab fookuse. - `
` : Hiire liikumine vidina sees. - `
` : Hiir siseneb vidinasse. - `
` : Hiir lahkub vidinast.
Näide: sildi värskendamine nupule klõpsamisel
Loome näite, kus nupule klõpsamine värskendab sildi teksti.
import tkinter as tk
def update_label(event):
label.config(text="Nuppu vajutati!")
root = tk.Tk()
root.title("Värskenda silti")
root.geometry("300x200")
label = tk.Label(root, text="Klõpsake allolevat nuppu")
button = tk.Button(root, text="Kliki mind")
button.bind("", update_label)
label.pack()
button.pack()
root.mainloop()
Selgitus:
- `label.config(text="Nuppu vajutati!")`: Muudab sildi teksti "Nuppu vajutati!" kasutades meetodit `config()`.
Tkinteri edasijõudnute kontseptsioonid
Kui olete Tkinteri põhitõdedega tuttav, saate keerukamate rakenduste loomiseks uurida edasijõudnute kontseptsioone.
Dialoogid ja teatekastid
Tkinter pakub sisseehitatud dialooge ja teatekaste teabe kuvamiseks, kasutaja sisendi küsimiseks ja vigade käsitlemiseks. Need dialoogid on modaalsed, mis tähendab, et need blokeerivad interaktsiooni peaaknaga, kuni need suletakse.
import tkinter as tk
from tkinter import messagebox
def show_message():
messagebox.showinfo("Teave", "See on teavitusteade.")
def ask_question():
answer = messagebox.askquestion("Küsimus", "Olete kindel?")
if answer == "jah":
print("Kasutaja ütles jah")
else:
print("Kasutaja ütles ei")
root = tk.Tk()
root.title("Dialoogid")
root.geometry("300x200")
button1 = tk.Button(root, text="Näita teadet", command=show_message)
button2 = tk.Button(root, text="Esita küsimus", command=ask_question)
button1.pack()
button2.pack()
root.mainloop()
Selgitus:
- `from tkinter import messagebox`: Impordib `messagebox` mooduli, mis sisaldab dialoogifunktsioone.
- `messagebox.showinfo("Teave", "See on teavitusteade.")`: Kuvab teabe teatekasti pealkirjaga "Teave" ja sõnumiga "See on teavitusteade."
- `messagebox.askquestion("Küsimus", "Olete kindel?")`: Kuvab küsimuste teatekasti pealkirjaga "Küsimus" ja sõnumiga "Olete kindel?" Kasutaja saab vastata "jah" või "ei."
Menüüd
Menüüd pakuvad struktureeritud viisi käskude ja valikute korraldamiseks teie rakenduses. Saate luua menüüribasid, rippmenüüsid ja kontekstimenüüsid.
import tkinter as tk
def do_nothing():
print("Ära tee midagi")
root = tk.Tk()
root.title("Menüüd")
root.geometry("400x300")
# Loo menüüriba
menubar = tk.Menu(root)
# Loo failimenüü
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Uus", command=do_nothing)
filemenu.add_command(label="Ava", command=do_nothing)
filemenu.add_command(label="Salvesta", command=do_nothing)
filemenu.add_separator()
filemenu.add_command(label="Välju", command=root.quit)
# Lisa failimenüü menüüribale
menubar.add_cascade(label="Fail", menu=filemenu)
# Loo redigeerimismenüü
editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label="Võta tagasi", command=do_nothing)
editmenu.add_command(label="Tee uuesti", command=do_nothing)
# Lisa redigeerimismenüü menüüribale
menubar.add_cascade(label="Redigeeri", menu=editmenu)
# Konfigureeri juuraken menüüriba kasutama
root.config(menu=menubar)
root.mainloop()
Selgitus:
- `menubar = tk.Menu(root)`: Loob menüüriba vidina.
- `filemenu = tk.Menu(menubar, tearoff=0)`: Loob failimenüü menüüriba alameks. Argument `tearoff=0` takistab menüü eraldi aknaks rebestamist.
- `filemenu.add_command(label="Uus", command=do_nothing)`: Lisab käsu failimenüüsse sildiga "Uus" ja käsuga `do_nothing`.
- `filemenu.add_separator()`: Lisab failimenüüsse eraldusjoone.
- `menubar.add_cascade(label="Fail", menu=filemenu)`: Lisab failimenüü menüüribale.
- `root.config(menu=menubar)`: Konfigureerib juurakna menüüriba kasutama.
Lõuendividin (Canvas Widget)
Lõuendividin võimaldab teil joonistada kohandatud graafikat, kujundeid ja teksti oma rakendusse. See on võimas tööriist visualiseerimiste, mängude ja muude graafiliste liideste loomiseks.
import tkinter as tk
root = tk.Tk()
root.title("Lõuend")
root.geometry("400x300")
canvas = tk.Canvas(root, width=400, height=300, bg="valge")
# Joonista ristkülik
canvas.create_rectangle(50, 50, 150, 100, fill="sinine")
# Joonista ring
canvas.create_oval(200, 50, 250, 100, fill="punane")
# Joonista joon
canvas.create_line(50, 150, 350, 150, width=3, fill="roheline")
# Joonista tekst
canvas.create_text(200, 250, text="Tere, Lõuend!", font=("Arial", 16))
canvas.pack()
root.mainloop()
Selgitus:
- `canvas = tk.Canvas(root, width=400, height=300, bg="valge")`: Loob lõuendividina laiusega 400 pikslit, kõrgusega 300 pikslit ja valge taustaga.
- `canvas.create_rectangle(50, 50, 150, 100, fill="sinine")`: Joonistab ristküliku ülemise vasaku nurgaga punktis (50, 50) ja alumise parema nurgaga punktis (150, 100), täidetud sinise värviga.
- `canvas.create_oval(200, 50, 250, 100, fill="punane")`: Joonistab ovaali (ringi) piirdekasti, mis on määratletud ülemise vasaku nurga (200, 50) ja alumise parema nurga (250, 100) abil, täidetud punase värviga.
- `canvas.create_line(50, 150, 350, 150, width=3, fill="roheline")`: Joonistab joone punktist (50, 150) punktini (350, 150) laiusega 3 pikslit ja rohelise värviga.
- `canvas.create_text(200, 250, text="Tere, Lõuend!", font=("Arial", 16))`: Joonistab teksti "Tere, Lõuend!" koordinaatidele (200, 250), kasutades Arial fondi suurusega 16.
Tkinteri arenduse parimad tavad
Hooldatavate ja skaleeritavate Tkinteri rakenduste loomiseks kaaluge järgmisi parimaid tavasid:
- Kasutage objektorienteeritud programmeerimist (OOP): Korraldage oma kood klassidesse ja objektidesse, et parandada struktuuri ja taaskasutatavust.
- Eraldage GUI loogika äriloogikast: Hoidke oma GUI kood lahus koodist, mis käsitleb teie rakenduse põhifunktsioone. See muudab teie koodi modulaarsemaks ja lihtsamini testitavaks.
- Kasutage ühtset kodeerimisstiili: Järgige ühtset kodeerimisstiili (nt PEP 8), et parandada loetavust ja hooldatavust.
- Lisage kommentaare: Lisage oma koodile kommentaare, et selgitada, mida see teeb ja miks. See aitab teil ja teistel teie koodist tulevikus aru saada.
- Kasutage versioonihaldust: Kasutage versioonihaldussüsteemi (nt Git), et jälgida oma koodi muudatusi ja teha koostööd teistega.
- Kaaluge rahvusvahelistumist (i18n) ja lokaliseerimist (l10n): Kui teie rakendus on mõeldud ülemaailmsele publikule, kaaluge oma rakenduse rahvusvahelistumist ja lokaliseerimist, et toetada erinevaid keeli ja kultuure. See hõlmab Unicode'i kasutamist teksti jaoks ja tõlgete pakkumist kõigile GUI tekstielementidele. Näiteks võite lubada kasutajal valida oma eelistatud keele seadete menüüst ja seejärel laadida vastavad tõlkefailid.
Rahvusvahelised näited ja kaalutlused
Tkinteri rakenduste arendamisel ülemaailmsele publikule on oluline arvestada piirkondlike erinevuste ja kultuuriliste nüanssidega. Siin on mõned näited:
- Kuupäeva- ja kellaajavormingud: Erinevates riikides kasutatakse erinevaid kuupäeva- ja kellaajavorminguid. Kasutage Pythoni `datetime` moodulit ja lokaadi sätteid, et vormindada kuupäevi ja kellaaegu vastavalt kasutaja lokaadile. Näiteks Ameerika Ühendriikides on kuupäevavorming tavaliselt MM/PP/AAAA, samas Euroopas on see sageli PP/MM/AAAA.
- Valuutavormingud: Kasutage `locale` moodulit valuutaväärtuste vormindamiseks vastavalt kasutaja lokaadile. Erinevates riikides kasutatakse erinevaid valuutasümboleid ja kümnendkohtade eraldajaid.
- Teksti suund: Mõned keeled, näiteks araabia ja heebrea, kirjutatakse paremalt vasakule. Tkinter toetab paremalt vasakule teksti suunda, kasutades vidinate jaoks valikut `orient`.
- Märgikodeering: Kasutage oma rakenduse kogu teksti jaoks Unicode'i (UTF-8), et toetada laia valikut erinevate keelte märke.
- Numbrite vormindamine: Olge teadlik numbrite kuvamiseks kasutatavatest erinevatest konventsioonidest. Näiteks mõned lokaadid kasutavad komasid kümnendkohtade eraldajatena ja punkte tuhandete rühmitamiseks, samas kui teised teevad vastupidi.
- Kasutajaliidese disain: Kasutajaliidese kujundamisel arvestage kultuuriliste eelistustega. Värvidel, sümbolitel ja piltidel võib erinevates kultuurides olla erinev tähendus. Kultuuriliste tundlikkuste uurimine aitab vältida tahtmatut solvamist.
Alternatiivid Tkinterile
Kuigi Tkinter on kindel valik paljude Pythoni GUI projektide jaoks, on saadaval ka mitu teist GUI teeki, millest igaühel on oma tugevused ja nõrkused. Siin on mõned märkimisväärsed alternatiivid:
- PyQt: Võimas ja funktsioonirikas GUI teek, mis põhineb Qt raamistikul. PyQt pakub laia valikut vidinaid ja tööriistu keerukate ja visuaalselt atraktiivsete rakenduste loomiseks. Tegemist on kommertsiaalse teegiga, kuid avatud lähtekoodiga projektide jaoks on saadaval GPL versioon.
- wxPython: Teine populaarne platvormiülene GUI teek, mis pakub erinevates operatsioonisüsteemides loomulikku välimust ja tunnetust. wxPython on tuntud oma ulatusliku vidinate komplekti ja võime poolest luua rakendusi, mis integreeruvad sujuvalt alusplatvormiga.
- Kivy: Platvormiülene GUI raamistik, mis on loodud kaasaegsete, puutetundlike rakenduste loomiseks. Kivy kasutab kohandatud UI keelt (Kv) ja toetab riistvaralist kiirendust sujuva jõudluse tagamiseks.
- Gtk+: Laialdaselt kasutatav platvormiülene tööriistakomplekt graafiliste kasutajaliideste loomiseks. Kuigi see ei ole Pythoni-spetsiifiline, on sellel Pythoni sidemed nimega PyGObject, mis võimaldavad GTK+ rakenduste arendamist Pythoni abil. Tavaliselt kasutatakse Linuxi rakenduste jaoks.
- PySimpleGUI: Teek, mis püüab lihtsustada GUI rakenduste loomist. See toetab Tkinterit, Qt-d, WxPythoni ja Remit taustaprogrammidena, võimaldades piiratud koodimuudatustega liidest vahetada.
Järeldus
Tkinter pakub lihtsat ja ligipääsetavat viisi töölauarakenduste loomiseks Pythoniga. Selle lihtsus, platvormiülene ühilduvus ja kaasamine Pythoni standardteeki muudavad selle suurepäraseks valikuks nii algajatele kui ka kogenud arendajatele. Selle juhendi käigus käsitletud kontseptsioonide omandamisega olete hästi varustatud laia valiku GUI rakenduste loomiseks, alates lihtsatest utiliitidest kuni keerukate andmete visualiseerimise tööriistadeni. Ärge unustage rakenduste kujundamisel arvestada globaalse publikuga ja kohandada neid erinevate lokaatide ja kultuuride jaoks.
Katsetage esitatud näiteid, uurige Tkinteri dokumentatsiooni ja looge oma projekte, et oma arusaamist süvendada. Head kodeerimist!