Ce vei învăța astăzi?
După această lecție vei construi interfețe grafice (GUI) (programe cu ferestre și butoane, folosite prin clicuri) cu biblioteca Tkinter: ferestre, etichete, casete de text, butoane și casete de mesaje.
Ce este o interfață grafică?
O interfață grafică (GUI) permite utilizatorului să lucreze cu ferestre, butoane și casete, prin clicuri și text, fără să scrie comenzi. Este user-friendly, adică ușor de folosit.
Analogie:
Programul cu text este ca un chestionar pe hârtie: răspunzi în scris, în ordine. Programul grafic este ca un meniu de restaurant: apeși pe ceea ce vrei și vezi imediat rezultatul.
Fereastra Tk și obiectele grafice
Importăm biblioteca cu from tkinter import *. Fereastra principală se creează cu Tk(). Apoi adăugăm obiecte: Label (etichetă de text), Button (buton), Entry (casetă de text), Text și Frame.
| Obiect | Rol | Exemplu |
|---|---|---|
| Label | Afișează un text | Label(f, text="Salut") |
| Button | Buton care execută o acțiune | Button(f, text="Apasa", command=salut) |
| Entry | Casetă în care utilizatorul scrie | Entry(f) |
| Text | Zonă de text multi-linie | Text(f) |
Obiectele se plasează în fereastră cu pack() (unul sub altul, centrat) sau cu grid() (în rânduri și coloane). Pentru a citi textul dintr-un Entry folosim metoda get().
Mesaje cu MessageBox
MessageBox afișează o casetă de dialog cu un mesaj. O aducem cu from tkinter import messagebox și o folosim astfel: messagebox.showinfo("Titlu", "Mesaj").
from tkinter import *
from tkinter import messagebox
fereastra = Tk()
fereastra.title("Aplicatia mea")
fereastra.geometry("300x200")
eticheta = Label(fereastra, text="Introdu numele tau:")
eticheta.pack()
caseta = Entry(fereastra)
caseta.pack()
def salut():
messagebox.showinfo("Mesaj", "Salut, " + caseta.get())
buton = Button(fereastra, text="Apasa", command=salut)
buton.pack()
fereastra.mainloop()
Reține: mainloop() pornește bucla de evenimente (mecanismul care așteaptă clicurile și apăsările utilizatorului) și ține fereastra deschisă. command=salut leagă butonul de funcția salut. caseta.get() citește textul introdus de utilizator.
Exercițiu de completare
Completează enunțul cu cuvintele potrivite:
Fereastra principală a unei aplicații Tkinter se creează cu ______(). Eticheta de text se creează cu ______, butonul cu ______, iar caseta de text cu ______. Obiectele le plasăm în fereastră cu ______() sau grid().
Bancă de cuvinte:
Test de înțelegere
Test rapid - Tkinter:
1. Fereastra principală se creează cu:
2. Eticheta de text se creează cu:
3. Caseta de text în care utilizatorul scrie se creează cu:
Test suplimentar
Test suplimentar - Tkinter:
1. Importăm biblioteca Tkinter cu instrucțiunea:
2. Butonul într-o interfață Tkinter se creează cu clasa:
3. Apelul mainloop() are rolul de a:
Aprofundare
pack() versus grid(): pack() așază obiectele unul sub altul, centrat, cu opțiuni precum side="left", pady=10 (spațiu vertical), fill="x" sau expand=True. grid() le așază într-o grilă: grid(row=0, column=1) - potrivit pentru formulare.
- Variabile legate:
text_var = StringVar()urmat deEntry(fereastra, textvariable=text_var)leagă caseta de variabilă; textul se citește cutext_var.get(). - Validarea numerelor:
int(caseta.get())poate da ValueError; îl prindem cu try/except și afișămmessagebox.showerror("Eroare", "Introdu un numar!"). - Tipuri de mesaje: showinfo (informație), showwarning (atenție), showerror (eroare), askyesno (da/nu, întoarce True sau False).
- Manipularea casetei:
caseta.delete(0, END)golește caseta,caseta.insert(0, "text")pune un text inițial. - Arhitectură curată: separă funcțiile de calcul (care întorc valori) de funcțiile de interfață (care afișează); butonul apelează doar funcția de interfață.
PbInfo - Aplicație cu buton
Enunț:
Cerință: Să se creeze o fereastră Tkinter care conține un Button. La apăsarea butonului, să se afișeze în MessageBox mesajul "Salut!".
Date de intrare:
Programul nu citește date de la tastatură.
Date de ieșire:
Programul afișează o fereastră grafică cu un buton; la clic apare un mesaj.
Restricții și precizări:
Valorile citite sunt numere întregi, iar n este un număr natural, cu 1 <= n <= 1000.
Exemplu:
Intrare:
(fără date de intrare)
Ieșire:
Fereastră cu buton; la clic apare "Salut!"
Cum gândim soluția:
- Importăm tkinter și messagebox
- Creăm fereastra cu Tk()
- Definim funcția salut() care afișează mesajul
- Creăm butonul cu command=salut și apelăm mainloop()
Scrie soluția în Python:
Soluție corectă:
from tkinter import *
from tkinter import messagebox
f = Tk()
def salut():
messagebox.showinfo("Mesaj", "Salut!")
b = Button(f, text="Apasa", command=salut)
b.pack()
f.mainloop()
Ce învățăm: butonul primește prin command funcția care se execută la clic, iar MessageBox afișează mesajul.
PbInfo - Casetă de text și mesaj
Enunț:
Cerință: Să se creeze o fereastră Tkinter cu un Entry și un Button. La apăsarea butonului, textul introdus în Entry să fie afișat în MessageBox (folosind get()).
Date de intrare:
Utilizatorul introduce un text în caseta Entry.
Date de ieșire:
La clic, programul afișează în MessageBox textul introdus.
Restricții și precizări:
Valorile citite sunt numere întregi, iar n este un număr natural, cu 1 <= n <= 1000.
Exemplu:
Intrare:
Utilizatorul scrie "Ana"
Ieșire:
Mesajul "Ana" apare în MessageBox
Cum gândim soluția:
- Importăm tkinter și messagebox
- Creăm fereastra, un Entry și un Button
- Definim funcția care citește textul cu get() și îl afișează
- Legăm funcția de buton cu command
Scrie soluția în Python:
Soluție corectă:
from tkinter import *
from tkinter import messagebox
f = Tk()
eticheta = Label(f, text="Scrie un text:")
eticheta.pack()
caseta = Entry(f)
caseta.pack()
def afiseaza():
messagebox.showinfo("Mesaj", caseta.get())
b = Button(f, text="Afișează", command=afiseaza)
b.pack()
f.mainloop()
Ce învățăm: metoda get() citește textul scris în Entry, iar MessageBox îl afișează utilizatorului.
Exercițiul Practic: Primele interfețe grafice
Sarcini de lucru
Construiește două aplicații Tkinter complete
Sarcina 1: Trei etichete cu grid
Cerință: Construiește o aplicație Tkinter cu trei Label-uri (Nume, Prenume, Clasa) și trei Entry-uri, aranjate în rânduri și coloane cu grid().
Soluție:
from tkinter import * f = Tk() Label(f, text="Nume:").grid(row=0, column=0) Label(f, text="Prenume:").grid(row=1, column=0) Label(f, text="Clasa:").grid(row=2, column=0) Entry(f).grid(row=0, column=1) Entry(f).grid(row=1, column=1) Entry(f).grid(row=2, column=1) f.mainloop()
Verifică: grid(row, column) așază obiectele în tabel, la rândul și coloana indicate.
Sarcina 2: Pătratul numărului introdus
Cerință: Construiește o aplicație Tkinter cu un Entry și un Button. La clic, programul afișează în MessageBox pătratul numărului introdus.
Soluție:
from tkinter import *
from tkinter import messagebox
f = Tk()
eticheta = Label(f, text="Introdu un numar:")
eticheta.pack()
caseta = Entry(f)
caseta.pack()
def patrat():
n = int(caseta.get())
messagebox.showinfo("Rezultat", "Patratul este: " + str(n * n))
b = Button(f, text="Calculeaza", command=patrat)
b.pack()
f.mainloop()
Verifică: int(caseta.get()) transformă textul citit în număr, apoi calculăm pătratul.