Școala Româno-Britanică
Modulul 5 Clasa a IX-a | Python

Ora 12: Proiect integrat cu interfață grafică (Tkinter)

Ce vei învăța astăzi: Construirea unei aplicații Tkinter complete pentru afișarea termenilor unui șir recurent

Rezultat practic: Creezi o aplicație cu fereastră, etichete, butoane, casete de text și casete de dialog MessageBox, care calculează și afișează termenii șirului lui Fibonacci (Competența 6.4).

Competența 6.4 Săptămâna 29

Înainte de a începe

De ce contează? Șirul lui Fibonacci apare în natură și în informatică, iar o aplicație grafică face calculul accesibil oricui: combini matematică, funcții și interfață într-un singur program.

Ce știi deja?

În lecția trecută ai generat numere cu random și le-ai salvat în fișier. Cum ai calcula termenii unui șir definit prin recurență, pas cu pas, în Python?

Ideea-cheie: Un șir recurent își calculează fiecare termen din termenii anteriori, iar în Tkinter calculul stă în funcții separate, interfața doar citind și afișând.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

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).

Ce este un șir recurent și cum se calculează termenii lui
Elementele interfeței grafice: Tk, Label, Entry, Button, MessageBox
Validarea datelor introduse de utilizator (verificarea că valorile introduse sunt corecte)
Afișarea termenilor șirului în aplicația grafică

Ș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.

Termena1a2a3a4a5a6a7
Valoare11235813

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).

ObiectRol în aplicațieExemplu
TkFereastra principalăfereastra = Tk()
LabelÎntrebarea și zona de rezultatLabel(fereastra, text="Câți termeni?")
EntryCasetă pentru numărul ncaseta = Entry(fereastra)
ButtonButonul "Afiseaza"Button(fereastra, text="Afiseaza", command=afiseaza)
messageboxMesaje de eroare sau atenționaremessagebox.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.

Algoritm Afisarea termenilor sirului lui Fibonacci Functie sir_fibonacci(n) sir <- [1, 1] pentru i <- 3, n executa adauga in sir sir[i-2] + sir[i-1] sfarsit pentru returneaza sir Sfarsit functie Start program creeaza fereastra Tk() creeaza eticheta de intrebare creeaza caseta de text Entry defineste functia afiseaza(): citeste textul din caseta daca textul nu este numar atunci afiseaza mesaj de eroare si opreste-te altfel termeni <- sir_fibonacci(n) afiseaza termenii in eticheta de rezultat creeaza butonul "Afiseaza" legat de functia afiseaza porneste mainloop() Stop program
Exemplu complet - aplicația Fibonacci cu Tkinter
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.

Ai grijă la: Textul din Entry este un șir de caractere: int(caseta.get()) fără try/except prăbușește aplicația la o intrare nevalidă.

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:
recurent Fibonacci 1 1

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:
Tk Entry get command messagebox

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?

APLICARE ȘI REZOLVARE DE PROBLEME

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:
  1. Definim funcția sir_fibonacci(n) care construiește lista termenilor
  2. Inițializăm primii termeni și completăm cu suma ultimilor doi
  3. Citim n, apelăm funcția și afișăm lista cu print(*sir)
Scrie soluția în Python:
Soluție corectă:
Soluția completă
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:
  1. Calculăm termenii cu funcția sir_fibonacci(n)
  2. Scriem fiecare termen în fișier cu write și str()
  3. Închidem fișierul cu close() și afișăm sum(sir)
Scrie soluția în Python:
Soluție corectă:
Soluția completă
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ȚII PRACTICE

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.

Scrie pe caiet - De reținut

Titlul lecției

Proiect integrat cu interfață grafică (Tkinter).

Definiția lecției

Proiectul combină matematica șirurilor recurente cu o interfață grafică Tkinter. Un șir recurent este un șir de numere în care fiecare termen se calculează din termenii anteriori printr-o relație de recurență: în șirul lui Fibonacci, an = a(n-1) + a(n-2), cu a1 = 1 și a2 = 1. Logica de calcul este separată de interfață: funcția sir_fibonacci(n) întoarce lista termenilor, iar funcția afiseaza() citește caseta Entry cu get(), validează valoarea cu try/except și afișează rezultatul într-o etichetă sau într-o casetă de dialog. Butonul declanșează calculul prin command=afiseaza, iar mainloop() ține fereastra deschisă.

Definiții esențiale

Algoritmul cheie - pseudocod

Functie sir_fibonacci(n) sir <- [1, 1] pentru i <- 3, n executa adauga in sir sir[i-2] + sir[i-1] sfarsit pentru returneaza sir Sfarsit functie Start program creeaza fereastra Tk() creeaza eticheta de intrebare creeaza caseta de text Entry defineste functia afiseaza(): citeste textul din caseta daca textul nu este numar atunci afiseaza mesaj de eroare si opreste-te altfel termeni <- sir_fibonacci(n) afiseaza termenii in eticheta de rezultat creeaza butonul "Afiseaza" legat de functia afiseaza porneste mainloop() Stop program

Algoritmul cheie - cod Python

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", "Numar pozitiv!")
            return
        eticheta_rezultat.config(text=", ".join(str(x) for x in sir_fibonacci(n)))
    except ValueError:
        messagebox.showerror("Eroare", "Numar intreg!")


fereastra = Tk()
fereastra.title("Sirul lui Fibonacci")
eticheta = Label(fereastra, text="Cati termeni?")
eticheta.pack()
caseta = Entry(fereastra)
caseta.pack()
buton = Button(fereastra, text="Afiseaza", command=afiseaza)
buton.pack()
eticheta_rezultat = Label(fereastra, text="", wraplength=380)
eticheta_rezultat.pack()
fereastra.mainloop()

Greșeli comune de evitat

Exemplu practic

O aplicație pentru laboratorul de biologie afișează creșterea unei populații de iepuri conform șirului lui Fibonacci, termen cu termen:

def sir_fibonacci(n):
    sir = [1, 1]
    for i in range(2, n):
        sir.append(sir[i - 1] + sir[i - 2])
    return sir


print(sir_fibonacci(7))   # afiseaza [1, 1, 2, 3, 5, 8, 13]

Sfaturi practice și trucuri