Ce vei învăța astăzi?
După această lecție vei construi o aplicație Tkinter completă: o fereastră cu etichete, o casetă de text, un buton și casete de dialog MessageBox, care calculează și afișează termenii unui șir recurent (șir în care fiecare termen se calculează din termenii anteriori).
Șiruri recurente - definiție și exemple
Definiție: Un șir recurent este un șir de numere în care fiecare termen se calculează din termenii anteriori printr-o relație de recurență. Cel mai cunoscut exemplu este șirul lui Fibonacci: a1 = 1, a2 = 1, an = a(n-1) + a(n-2).
Analogia din viața reală:
Șirul lui Fibonacci apare în natură: în spirala melcului, în aranjarea frunzelor și în creșterea unei populații de iepuri. Fiecare termen "moștenește" informația din cei doi termeni anteriori, exact ca o familie care se extinde din generațiile precedente.
| Termen | a1 | a2 | a3 | a4 | a5 | a6 | a7 |
|---|---|---|---|---|---|---|---|
| Valoare | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
Reține: pentru a calcula termenul an, trebuie să cunoaștem termenii a(n-1) și a(n-2). De aceea începem cu primii doi termeni și construim șirul pas cu pas, într-o listă.
Elementele aplicației Tkinter
Aplicația noastră folosește obiecte grafice: Tk() (fereastra principală), Label (etichete de text), Entry (caseta în care utilizatorul scrie numărul de termeni), Button (butonul care declanșează calculul) și messagebox (casete de dialog pentru mesaje).
| Obiect | Rol în aplicație | Exemplu |
|---|---|---|
| Tk | Fereastra principală | fereastra = Tk() |
| Label | Întrebarea și zona de rezultat | Label(fereastra, text="Câți termeni?") |
| Entry | Casetă pentru numărul n | caseta = Entry(fereastra) |
| Button | Butonul "Afiseaza" | Button(fereastra, text="Afiseaza", command=afiseaza) |
| messagebox | Mesaje de eroare sau atenționare | messagebox.showerror("Eroare", "Text") |
Obiectele se plasează cu pack(), textul din casetă se citește cu get(), iar fereastra rămâne deschisă cu mainloop(). Textul introdus de utilizator este un șir: îl convertim cu int(...), protejați de erori prin try/except (mecanism de prindere a erorilor, care nu oprește programul).
Aplicația completă - termenii șirului lui Fibonacci
Logica de calcul este separată de interfață: funcția sir_fibonacci(n) întoarce lista termenilor, iar funcția afiseaza() citește caseta, validează valoarea și afișează rezultatul în eticheta de rezultat sau într-o casetă de dialog.
from tkinter import *
from tkinter import messagebox
def sir_fibonacci(n):
sir = [1]
if n == 1:
return sir
sir.append(1)
for i in range(2, n):
sir.append(sir[i - 1] + sir[i - 2])
return sir
def afiseaza():
text = caseta.get()
try:
n = int(text)
if n <= 0:
messagebox.showwarning("Atentie", "Introdu un numar pozitiv!")
return
termeni = sir_fibonacci(n)
eticheta_rezultat.config(text=", ".join(str(x) for x in termeni))
except ValueError:
messagebox.showerror("Eroare", "Introdu un numar intreg!")
fereastra = Tk()
fereastra.title("Sirul lui Fibonacci")
fereastra.geometry("440x240")
eticheta = Label(fereastra, text="Cati termeni din sirul lui Fibonacci doriti?")
eticheta.pack(pady=10)
caseta = Entry(fereastra)
caseta.pack(pady=5)
buton = Button(fereastra, text="Afiseaza", command=afiseaza)
buton.pack(pady=10)
eticheta_rezultat = Label(fereastra, text="", wraplength=400)
eticheta_rezultat.pack(pady=10)
fereastra.mainloop()
Observă: un text nevalid din casetă nu oprește programul: blocul try/except prinde ValueError și anunță utilizatorul printr-o casetă de dialog. Acesta este comportamentul unei aplicații profesionale.
Aprofundare
Legarea automată a casetei de o variabilă: cu text_var = StringVar() și Entry(fereastra, textvariable=text_var), textul din casetă este sincronizat automat cu variabila; îl citim cu text_var.get() și îl putem reseta cu text_var.set("").
- Arhitectura în două straturi: funcțiile de calcul (sir_fibonacci) nu ating obiectele grafice; funcțiile de interfață (afiseaza) doar citesc, calculează și afișează. Modificarea logicii nu atinge interfața și invers.
- Așezarea cu grid: pentru formulare,
grid(row=0, column=0)oferă control precis; pack așază secvențial. - Casete de dialog variate: showinfo (informare), showwarning (atenționare), showerror (eroare) și askyesno (întrebare Da/Nu, care întoarce True sau False).
- Limite reale: termenii Fibonacci cresc exponențial; pentru n mare (peste 30) valorile devin uriașe, iar afișarea într-o singură linie devine incomodă - putem afișa doar suma sau ultimii termeni.
- Caz particular: testați funcția sir_fibonacci(1) și sir_fibonacci(2): ambele trebuie să dea rezultate corecte, deși n <= 0 este refuzat la interfață.
Exercițiu de completare
Completează enunțul cu cuvintele potrivite:
Un șir în care fiecare termen se calculează din termenii anteriori se numește șir ______. Cel mai cunoscut exemplu este șirul lui ______, cu primii termeni ______ și ______. Fiecare termen este suma celor doi termeni anteriori.
Bancă de cuvinte:
Exercițiu de completare
Completează enunțul cu cuvintele potrivite:
Fereastra principală se creează cu ______(). Casetă în care utilizatorul scrie se numește ______, iar textul ei se citește cu metoda ______(). Butonul se leagă de o funcție prin opțiunea ______, iar mesajele de eroare se afișează cu ______.
Bancă de cuvinte:
Test de înțelegere
Test rapid - șiruri recurente și Tkinter:
1. Care sunt primii patru termeni ai șirului lui Fibonacci?
2. Cu ce metodă citim textul introdus într-o casetă Entry?
3. Ce face blocul try/except din funcția afiseaza?
PbInfo - Șirul lui Fibonacci
Enunț:
Cerință: Se citește numărul natural n. Să se afișeze primii n termeni ai șirului lui Fibonacci (a1 = 1, a2 = 1), folosind o funcție sir_fibonacci(n) care întoarce lista termenilor.
Date de intrare:
Programul citește de la tastatură numărul natural n.
Date de ieșire:
Programul va afișa pe o singură linie primii n termeni ai șirului, separați prin spațiu.
Restricții și precizări:
Valorile citite sunt numere întregi, iar n este un număr natural, cu 1 <= n <= 30.
Exemplu:
Intrare:
7
Ieșire:
1 1 2 3 5 8 13
Cum gândim soluția:
- Definim funcția
sir_fibonacci(n)care construiește lista termenilor - Inițializăm primii termeni și completăm cu suma ultimilor doi
- Citim n, apelăm funcția și afișăm lista cu print(*sir)
Scrie soluția în Python:
Soluție corectă:
def sir_fibonacci(n):
sir = [1]
if n == 1:
return sir
sir.append(1)
for i in range(2, n):
sir.append(sir[i - 1] + sir[i - 2])
return sir
n = int(input())
print(*sir_fibonacci(n))
Ce învățăm: o funcție care construiește un șir recurent într-o listă se poate refolosi atât în consolă, cât și într-o aplicație grafică.
PbInfo - Termenii Fibonacci în fișier
Enunț:
Cerință: Se citește numărul natural n. Să se calculeze primii n termeni ai șirului lui Fibonacci și să se scrie în fișierul text "fibo.txt", câte unul pe fiecare linie, apoi să se afișeze suma lor.
Date de intrare:
Programul citește de la tastatură numărul natural n.
Date de ieșire:
Programul va crea fișierul "fibo.txt" cu primii n termeni, câte unul pe linie, și va afișa pe ecran suma termenilor.
Restricții și precizări:
Valorile citite sunt numere întregi, iar n este un număr natural, cu 1 <= n <= 30.
Exemplu:
Intrare:
5
Ieșire:
12
Cum gândim soluția:
- Calculăm termenii cu funcția sir_fibonacci(n)
- Scriem fiecare termen în fișier cu write și str()
- Închidem fișierul cu close() și afișăm sum(sir)
Scrie soluția în Python:
Soluție corectă:
def sir_fibonacci(n):
sir = [1]
if n == 1:
return sir
sir.append(1)
for i in range(2, n):
sir.append(sir[i - 1] + sir[i - 2])
return sir
n = int(input())
sir = sir_fibonacci(n)
f = open("fibo.txt", "w")
for x in sir:
f.write(str(x) + "\n")
f.close()
print(sum(sir))
Ce învățăm: aceeași listă de termeni poate fi salvată în fișier și prelucrată cu funcții predefinite, integrând două module.
Exercițiul Practic: Aplicația grafică Fibonacci
Sarcini de lucru
Completează cele două sarcini pentru a-ți consolida aplicația Tkinter cu șiruri recurente
Sarcina 1: Suma termenilor în casetă de dialog
Cerință: Construiește o aplicație Tkinter cu o etichetă, o casetă Entry și un buton. La apăsarea butonului, citește n, calculează primii n termeni Fibonacci și afișează suma lor într-o casetă de dialog messagebox.showinfo.
Soluție:
from tkinter import *
from tkinter import messagebox
def suma_fibonacci(n):
sir = [1, 1]
for i in range(2, n):
sir.append(sir[i - 1] + sir[i - 2])
return sum(sir)
def afiseaza():
try:
n = int(caseta.get())
if n <= 0:
messagebox.showwarning("Atentie", "Numar pozitiv!")
return
messagebox.showinfo("Rezultat", "Suma: " + str(suma_fibonacci(n)))
except ValueError:
messagebox.showerror("Eroare", "Numar intreg!")
fereastra = Tk()
fereastra.title("Suma Fibonacci")
eticheta = Label(fereastra, text="Cati termeni?")
eticheta.pack()
caseta = Entry(fereastra)
caseta.pack()
buton = Button(fereastra, text="Calculeaza", command=afiseaza)
buton.pack()
fereastra.mainloop()
Verifică: logica (suma_fibonacci) este separată de interfață (afiseaza), iar rezultatul ajunge la utilizator prin messagebox, cu validare try/except.
Sarcina 2: Salvarea termenilor în fișier
Cerință: Extinde aplicația de la Sarcina 1 cu un al doilea buton "Salveaza", care scrie termenii Fibonacci calculați în fișierul "fibonacci.txt", câte unul pe linie, și anunță utilizatorul printr-o casetă de dialog.
Soluție:
from tkinter import *
from tkinter import messagebox
def sir_fibonacci(n):
sir = [1, 1]
for i in range(2, n):
sir.append(sir[i - 1] + sir[i - 2])
return sir
def salveaza():
try:
n = int(caseta.get())
sir = sir_fibonacci(n)
f = open("fibonacci.txt", "w")
for x in sir:
f.write(str(x) + "\n")
f.close()
messagebox.showinfo("Salvat", "Termenii au fost salvati in fibonacci.txt")
except ValueError:
messagebox.showerror("Eroare", "Numar intreg!")
fereastra = Tk()
fereastra.title("Salvare Fibonacci")
eticheta = Label(fereastra, text="Cati termeni?")
eticheta.pack()
caseta = Entry(fereastra)
caseta.pack()
buton = Button(fereastra, text="Salveaza", command=salveaza)
buton.pack()
fereastra.mainloop()
Verifică: butonul "Salveaza" reutilizează funcția de calcul și adaugă modulul de fișiere: open, write, close, totul cu mesaj de confirmare.