Combini componente
Construiești o aplicație completă din widgeturile studiate.
Calculatoare, formulare și mici aplicații interactive
Construiești o aplicație completă din widgeturile studiate.
Citești și prelucrezi date introduse prin Entry.
Legezi butoane de funcții care calculează sau verifică.
Folosești MessageBox, tratezi date invalide și testezi aplicația.
Care este fluxul de bază al unei aplicații interactive?
În lecțiile 5.1–5.3 am construit treptat fereastra, widgeturile, organizarea și citirea valorilor din Entry. Acum le combinăm într-o aplicație care rezolvă o problemă reală.
Utilizatorul completează câmpurile.
Apasă un buton.
Funcția citește și calculează.
Rezultatul sau mesajul apare în interfață.
Un utilizator poate lăsa un câmp gol sau poate introduce text acolo unde programul așteaptă un număr. De aceea, folosim try/except pentru conversiile numerice.
Calculatorul primește două numere și permite adunarea, scăderea, înmulțirea și împărțirea. Pentru împărțire tratăm separat cazul în care al doilea număr este zero.
De ce trebuie tratat separat cazul b == 0?
O aplicație interactivă urmează un flux simplu: utilizatorul introduce date, apasă un buton, programul citește și prelucrează datele, apoi comunică rezultatul.
Alege o operație.
Înlocuiește b cu 0 și încearcă împărțirea. Apoi scrie abc în a.
Aplicația trebuie să trateze aceste situații fără să se oprească.
def calculeaza(op):
try:
a = float(camp_a.get())
b = float(camp_b.get())
except ValueError:
messagebox.showwarning("Date invalide", "Introdu numere.")
return
if op == "+":
rezultat = a + b
elif op == "-":
rezultat = a - b
elif op == "*":
rezultat = a * b
else:
if b == 0:
messagebox.showwarning("Eroare", "Împărțirea la zero nu este permisă.")
return
rezultat = a / b
rezultat_label.config(text="Rezultat: " + str(rezultat))
Funcția citește valorile cu get(), încearcă conversia la float, verifică împărțirea la zero și apoi modifică textul unui Label prin config().
Rezultat: —
ALGORITM Calculator
citește valorile din Entry
încearcă transformarea lor în numere
dacă datele sunt invalide atunci
afișează avertisment
altfel
dacă operația este împărțire și al doilea număr este 0 atunci
afișează avertisment
altfel
efectuează operația
afișează rezultatul
sfârșit dacă
sfârșit dacă
SFÂRȘIT ALGORITMApasă etapele în ordinea corectă.
get() returnează textPentru calcule numerice trebuie să convertim valoarea, de exemplu cu float().
ValueErrorConversia unui text precum „abc” la număr poate produce această eroare.
Verificarea lui b == 0 trebuie făcută înainte de împărțire.
O funcție pentru calcul face codul mai ușor de înțeles și reutilizat.
Construiește un calculator cu două numere care permite adunarea, scăderea, înmulțirea și împărțirea.
Funcția calculeaza(op) citește cele două Entry, convertește valorile și execută operația cerută. Pentru date invalide sau împărțire la zero se afișează un avertisment.
Intrare: două valori și operația aleasă. Ieșire: rezultatul sau un mesaj. Cazuri speciale: date invalide și divizor zero.
citește a și b
încearcă transformarea în numere
dacă transformarea eșuează, afișează avertisment
dacă op = împărțire și b = 0, afișează avertisment
altfel calculează
afișează rezultatuldef calculeaza(op):
try:
a = float(camp_a.get())
b = float(camp_b.get())
except ValueError:
messagebox.showwarning("Date invalide", "Introdu numere.")
return
if op == "+":
rezultat = a + b
elif op == "-":
rezultat = a - b
elif op == "*":
rezultat = a * b
else:
if b == 0:
messagebox.showwarning("Eroare", "Împărțirea la zero nu este permisă.")
return
rezultat = a / b
rezultat_label.config(text="Rezultat: " + str(rezultat))| Test | Date | Rezultat așteptat |
|---|---|---|
| Caz normal | 8, 2, + | 10.0 |
| Caz-limită | 0, 5, * | 0.0 |
| Caz particular | 5, 5, / | 1.0 |
| Date invalide | 8, abc, + | Avertisment; calculul nu continuă. |
| Divizare la zero | 8, 0, / | Avertisment; împărțirea nu se execută. |
try/except, iar împărțirea este executată numai după verificarea lui b == 0.1. Care este fluxul de bază al unei aplicații grafice interactive?
2. De ce convertim valoarea citită cu Entry.get() înainte de un calcul numeric?
3. Ce poate apărea la float("abc")?
4. Ce trebuie verificat înainte de a calcula a / b?
5. Ce rol are messagebox.showwarning() într-o aplicație?
6. Ce permite o aplicație grafică bine testată?
Realizează o aplicație grafică alcătuită din două zone: „Calcul” și „Date”. În zona de calcul, utilizatorul poate introduce două numere și poate calcula suma, diferența, produsul și câtul. În zona de date, include un mic formular cu nume și clasă. Folosește Frame, Label, Entry, Button, MessageBox și o metodă de organizare potrivită.
Testează aplicația pe caz normal, caz-limită, caz particular, date invalide și împărțire la zero.