Bir baba olarak okula giden öğrenciler için Türkçe Test Sınavı projesi tasarladım. Şuan soru ve cevapları kendi içersinden çekiyor. İlerleyen versiyonlarda yönetim kısmı olacak ve bu kısımda kaç soru olacağı, kaç seçenek bulunacağı ve diğer bilgilendirme mesajlarının da içeriği bölümler olacak. Peki program tam olarak ne işe yarıyor ?

Makale Başlığı:
Etkileşimli Python GUI Tasarımı ve PDF Sertifika Otomasyonu: Tkinter ve ReportLab Kütüphaneleriyle Dinamik Test Uygulaması Geliştirme
Makale:
Giriş
Python programlama dili, esnekliği ve geniş kütüphane desteği sayesinde eğitim yazılımlarında sıkça tercih edilmektedir. Bu makalede, Türkçe dil bilgisi konularında öğrenci değerlendirmesi yapabilen, doğru-yanlış analizleri sunabilen ve başarı sertifikası oluşturabilen bir test uygulaması geliştirme süreci ele alınacaktır. Uygulama, Tkinter ile kullanıcı arayüzü oluşturma, ReportLab kütüphanesiyle PDF dosya üretme ve random modülüyle veri manipülasyonu gibi pek çok önemli tekniği bir araya getirir.
Tkinter ile Dinamik Kullanıcı Arayüzü Tasarımı
Tkinter, Python’un GUI geliştirme kütüphanesi olarak kullanıcı dostu bir arayüz oluşturma imkanı sunar. Bu uygulamada, Tkinter’in Frame, Label, Radiobutton, Progressbar, Button gibi bileşenleri kullanılarak kapsamlı bir sınav arayüzü tasarlanmıştır. Örneğin, kullanıcıdan isim, okul bilgisi gibi verileri toplamak amacıyla açılır bir form oluşturulmuştur. Bu form, kullanıcı bilgilerinin sınav başlamadan önce kaydedilmesini sağlar ve kayıt işlemi ardından otomatik olarak sınav süreci başlatılır.
Kullanıcı Bilgilerini Toplama
Uygulamanın başlatılabilmesi için kullanıcının kimlik bilgileri (name, number, class, school) bir form üzerinden alınır. Kullanıcı bilgilerinin alınmasıyla, test sonrası başarı belgesi oluşturulurken bu bilgilerin PDF dosyasına dinamik bir şekilde işlenmesi sağlanır.
Soru ve Cevap İşleme Mantığı
Program, 40 adet soru barındıran bir veri yapısı kullanmaktadır. Her bir soru, çoktan seçmeli yanıt seçenekleri ve doğru cevap bilgisini içermektedir. Sorular, random.shuffle() işleviyle rastgele sıraya dizilerek sınav sırasında tekrarlayan sıralardan kaçınılması sağlanır. Bu, kullanıcıların sınavları tekrar aldığında karşılaşacakları soru sırasını değiştirerek farklı test deneyimleri yaşamalarını sağlar.
Test Başarısını Ölçme ve İlerleme Çubuğu
Testin ilerleme durumu, doğru ve yanlış cevap sayıları üzerinden Progressbar ile görselleştirilmiştir. Doğru cevaplar ve toplam puan arttıkça, kullanıcıya anlık bir geribildirim sağlanır. İlerleme çubuğu, kullanıcı performansını görsel olarak yansıtarak sınav deneyimini daha interaktif bir hale getirir. Ayrıca, test sonunda total_score değeri, PASS_SCORE sınırıyla kıyaslanarak kullanıcıya başarı durumu hakkında bilgi verilir.
Geçme Puanı ve Puan Hesaplama
Sınav, her doğru cevap için belirlenen POINTS_PER_CORRECT_ANSWER değeri ile toplam puan hesaplanır ve PASS_SCORE ile kıyaslanır. Kullanıcı geçme puanına ulaştığında, otomatik olarak PDF sertifikası oluşturulur.
ReportLab ile Dinamik PDF Sertifikası Oluşturma
Başarı belgesi, kullanıcının kimlik bilgilerinin ve başarı durumunun yer aldığı renkli bir PDF dosyasıdır. ReportLab, PDF oluşturma sürecinde geniş seçenekler sunar. canvas bileşeni kullanılarak belgeye özel renkli çerçeve eklenmiş, font ve renk seçenekleri ile görsel olarak etkileyici bir belge tasarlanmıştır.
Sertifika Tasarım Detayları
ReportLab'ın setFillColor ve rect fonksiyonları, PDF üzerine grafiksel bileşenler eklemek için kullanılmıştır. Klasik "Başarı Belgesi" başlığı, Helvetica-Bold fontu ile merkeze hizalanarak PDF'in estetik yapısı güçlendirilmiştir. Belge, kullanıcının ismi, okul numarası, sınıfı ve okulu gibi bilgilerle özelleştirilir. Ek olarak, sertifikanın alt kısmına otomatik bir "Okul Müdürü" imza alanı yerleştirilmiştir.
Sınav Sonuçlarını Görüntüleme
Kullanıcının verdiği cevapların doğruluğunu listeleyen bir sonuç ekranı, Treeview bileşeni ile sağlanmıştır. Bu yapı, her soru için doğru cevap ve kullanıcının verdiği cevabı tablo halinde görüntüleyerek kullanıcıya detaylı bir analiz sağlar. Treeview, kullanıcı yanıtlarının sistematik bir biçimde görselleştirilmesi açısından oldukça kullanışlıdır.
Yeniden Başlatma Seçeneği
Uygulama, kullanıcıya sınavı yeniden başlatma imkanı tanır. restart_test() işlevi, tüm sayaçları sıfırlayarak sınavın tekrar edilmesini sağlar. Bu özellik, kullanıcıların eksik oldukları konularda kendilerini geliştirmeleri için fırsat sunar.
Sonuç ve Değerlendirme
Bu uygulama, eğitsel yazılımların verimliliğini artıracak bir sınav deneyimi sunmaktadır. Python’un Tkinter, ReportLab ve random gibi modüllerinin bir araya getirilmesiyle elde edilen çözüm, kullanıcı arayüz tasarımından PDF sertifika otomasyonuna kadar birçok işlevi birleştirir. Eğitimde dijitalleşmenin önem kazandığı günümüzde, bu tür yazılımlar, öğrencilerin öğrenim süreçlerine katkıda bulunurken öğretmenlerin de öğrencilerin durumunu daha etkin takip etmelerini sağlar.
Bu projeyi çalıştırmak için ihtiyacınız olan kütüphaneler şunlardır:
Tkinter: Python'un standart kütüphanesi içinde yer aldığı için ayrıca kurulum gerektirmez. Grafiksel kullanıcı arayüzleri (GUI) geliştirmek için kullanılır.
ReportLab: PDF dosyaları oluşturmak için kullanılır. Python'un standart kütüphanesinde yer almadığından, ayrıca yüklenmesi gerekir.
random: Python'un standart kütüphanesi içinde yer alır ve ayrıca kurulum gerektirmez. Soruları karıştırmak ve rastgele işlemler için kullanılır.
Gerekli Kütüphanelerin Kurulumu
ReportLab kütüphanesini yüklemek için aşağıdaki komutu çalıştırabilirsiniz:
pip install reportlab
Bu komut, ReportLab kütüphanesini indirip kuracaktır. Diğer kütüphaneler olan Tkinter ve random, Python ile birlikte geldiğinden herhangi bir kurulum işlemi gerektirmez.
Gerekli Olan Python Kodu
import tkinter as tk
from tkinter import ttk
import random
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.lib import colors
import os
# Test soruları (Toplam 40 adet)
# Test soruları (Toplam 40 adet)
questions = [
("1. Aşağıdaki cümlelerden hangisi soyut anlam taşır?",
{"a": "O işine çok aşıktır.", "b": "Ağaç yapraklarını döktü.", "c": "Ev çok soğuktu.", "d": "Köpek havladı."}, "a"),
("2. Aşağıdaki ifadelerden hangisi terim anlam içerir?",
{"a": "Matematikte türev işlemi çok önemlidir.", "b": "Evde sessizlik vardı.", "c": "Gözleri ışıl ışıldı.", "d": "Sonsuz bir sevgiye sahipti."}, "a"),
("3. Aşağıdaki cümlelerden hangisi mecaz anlam taşır?",
{"a": "Kalbim pır pır ediyor.", "b": "Sınav sonuçlarını aldı.", "c": "Eli kalem tutuyordu.", "d": "Çiçekler açmaya başladı."}, "a"),
("4. Aşağıdaki seçeneklerden hangisi somut anlam içerir?",
{"a": "Ona güvenmek çok zor.", "b": "Bardağı masaya koydu.", "c": "Sevgisini her zaman gösterir.", "d": "Özgürlüğün tadını çıkarıyordu."}, "b"),
("5. Aşağıdaki ifadelerden hangisi terim anlam içerir?",
{"a": "Fizikte ivme hesaplaması yapılır.", "b": "Onunla çok mutluydu.", "c": "Özgürlük herkesin hakkıdır.", "d": "Kalemi masaya bıraktı."}, "a"),
("6. Hangi cümlede mecaz anlam bulunmaktadır?",
{"a": "Düşünceleri kanatlanmıştı.", "b": "Kapıyı yavaşça kapattı.", "c": "Ağaçlar çiçek açtı.", "d": "Onu çok özlemişti."}, "a"),
("7. Aşağıdaki ifadelerden hangisi gerçek anlam içerir?",
{"a": "Onun ayakları yere basmıyordu.", "b": "Elindeki kitabı masaya koydu.", "c": "İçini sevinç kapladı.", "d": "Çok üzgündü."}, "b"),
("8. Aşağıdaki ifadelerden hangisi terim anlam taşır?",
{"a": "Kimyada iyon bağları vardır.", "b": "Ağaç yapraklarını döktü.", "c": "Sevgi dolu bir insandı.", "d": "İçinde mutluluk vardı."}, "a"),
("9. Aşağıdaki cümlelerden hangisi soyut anlam taşır?",
{"a": "Onun dostluğu paha biçilemez.", "b": "Kitabı rafa koydu.", "c": "Çiçekler açmaya başladı.", "d": "Pencereden bakıyordu."}, "a"),
("10. Hangi cümlede mecaz anlam bulunmaktadır?",
{"a": "Sözleri kalbimi deldi geçti.", "b": "Suyu içti.", "c": "Kitap rafında duruyordu.", "d": "Kapıyı kapattı."}, "a"),
("11. Hangi cümlede terim anlam vardır?",
{"a": "Matematikte türev işlemi yapılır.", "b": "İçindeki sevgi büyüdü.", "c": "Kalbim pır pır ediyor.", "d": "Onunla çok mutluydu."}, "a"),
("12. Aşağıdaki cümlelerden hangisi soyut anlam içerir?",
{"a": "Rüzgar esti.", "b": "Kalbimde derin bir sevgi var.", "c": "Ağaç dallarını kırdı.", "d": "Kuşlar ötüyordu."}, "b"),
("13. Aşağıdaki ifadelerden hangisi somut anlam içerir?",
{"a": "Gözlerim yorgun.", "b": "Sevgisini belli ediyor.", "c": "Düşünceleri derindi.", "d": "Kalemi masaya bıraktı."}, "d"),
("14. Aşağıdaki seçeneklerden hangisi mecaz anlam içerir?",
{"a": "Onun gülüşü kalbimi ısıttı.", "b": "Kitabı rafa koydu.", "c": "Camı kapattı.", "d": "Çiçekler sulandı."}, "a"),
("15. Aşağıdaki ifadelerden hangisi terim anlam içerir?",
{"a": "Kimya dersinde bileşikler anlatıldı.", "b": "Yüreğim sevinç dolu.", "c": "Ona güveniyorum.", "d": "Kapıyı kapattı."}, "a"),
("16. Hangi cümlede soyut anlam bulunmaktadır?",
{"a": "Sevgi dolu bir insandı.", "b": "Bardak masada duruyor.", "c": "Kitabı rafa koydu.", "d": "Çiçekler açtı."}, "a"),
("17. Hangi cümlede somut bir anlam vardır?",
{"a": "Kapıyı kapattı.", "b": "Onun kalbinde bir sevgi var.", "c": "Korkusu gözlerinden okunuyordu.", "d": "Düşünceleri dağınıktı."}, "a"),
("18. Aşağıdaki ifadelerden hangisi gerçek anlam taşır?",
{"a": "Onun düşünceleri çok ağır.", "b": "Kapıyı kapattı.", "c": "Sevgisi çok derin.", "d": "İçimde korku var."}, "b"),
("19. Hangi cümlede mecaz anlam vardır?",
{"a": "Kalbim pır pır ediyor.", "b": "Kitabı yerine koydu.", "c": "Sevgisi gözlerinden okunuyordu.", "d": "Pencereyi kapattı."}, "a"),
("20. Hangi cümlede terim anlam bulunmaktadır?",
{"a": "Fizikte hız hesaplanır.", "b": "Onu çok özlüyorum.", "c": "Sevinçten havalara uçtu.", "d": "Kuşlar uçuşuyor."}, "a"),
("21. Aşağıdaki ifadelerden hangisi soyut anlam taşır?",
{"a": "Kitabı masaya koydu.", "b": "Sevgi en güçlü duygudur.", "c": "Kapıyı kapattı.", "d": "Elini kaldırdı."}, "b"),
("22. Hangi cümlede somut bir anlam bulunur?",
{"a": "Pencereyi kapattı.", "b": "Düşünceleri dağınıktı.", "c": "Kalbimde bir sevgi var.", "d": "Korkusu gözlerinden okunuyordu."}, "a"),
("23. Aşağıdaki cümlelerden hangisi mecaz anlam içerir?",
{"a": "Gözlerim yorgun.", "b": "Kitabı masaya koydu.", "c": "Ağaç yapraklarını döktü.", "d": "Çiçekleri suladı."}, "a"),
("24. Aşağıdaki ifadelerden hangisi terim anlam içerir?",
{"a": "Coğrafyada enlem ve boylam vardır.", "b": "Yüreğim sevinç dolu.", "c": "Onu çok özlüyorum.", "d": "Kalemi eline aldı."}, "a"),
("25. Hangi cümlede soyut anlam bulunur?",
{"a": "Kalbinde sevgi vardı.", "b": "Kapıyı kapattı.", "c": "Gözlerim çok yoruldu.", "d": "Bardağı masaya koydu."}, "a"),
("26. Hangi ifade gerçek anlam taşır?",
{"a": "Gözleri ışıl ışıl parlıyordu.", "b": "Elindeki kitabı masaya koydu.", "c": "İçimde derin bir özlem var.", "d": "Korkudan tir tir titriyordu."}, "b"),
("27. Hangi cümlede mecaz anlam bulunmaktadır?",
{"a": "İçim sevinç dolu.", "b": "Kitap masada duruyor.", "c": "Pencereyi kapattı.", "d": "Çiçekleri suladı."}, "a"),
("28. Aşağıdaki ifadelerden hangisi somut anlam içerir?",
{"a": "Onun düşünceleri derindi.", "b": "Kapıyı yavaşça kapattı.", "c": "İçimde korku var.", "d": "Sevgi dolu bir insan."}, "b"),
("29. Hangi cümlede terim anlam bulunur?",
{"a": "Geometride açılar ölçülür.", "b": "Onu özlemle bekliyorum.", "c": "Kalbimde derin bir sevgi var.", "d": "Elini tuttu."}, "a"),
("30. Hangi cümlede soyut anlam vardır?",
{"a": "Kalbimde derin bir sevgi var.", "b": "Kapıyı açtı.", "c": "Kitap rafa koyuldu.", "d": "Bardak düştü."}, "a"),
("31. Aşağıdaki ifadelerden hangisi mecaz anlam içerir?",
{"a": "Kalbi taş gibiydi.", "b": "Onu sevinçle karşıladı.", "c": "Gözleri ışıl ışıldı.", "d": "Elini ona uzattı."}, "a"),
("32. Hangi cümlede terim anlam bulunmaktadır?",
{"a": "Fizikte kuvvet hesaplanır.", "b": "İçimde bir hüzün var.", "c": "Gözleri çok parlak.", "d": "Kitap okudu."}, "a"),
("33. Hangi cümlede soyut anlam vardır?",
{"a": "Gözyaşlarını tutamadı.", "b": "Sevgi dolu bir insandı.", "c": "Bardağı masaya koydu.", "d": "Kapıyı açtı."}, "b"),
("34. Hangi cümlede gerçek anlam bulunmaktadır?",
{"a": "Elindeki bardağı masaya koydu.", "b": "Kalbimde bir sevgi var.", "c": "İçim huzur dolu.", "d": "Gözleri ışıl ışıl parlıyordu."}, "a"),
("35. Hangi cümlede mecaz anlam vardır?",
{"a": "Sözleri içimi deldi geçti.", "b": "Kitabı masaya koydu.", "c": "Kapıyı yavaşça kapattı.", "d": "Çiçekleri suladı."}, "a"),
("36. Aşağıdaki ifadelerden hangisi terim anlam içerir?",
{"a": "Kimyada elementler incelenir.", "b": "İçimde bir özlem var.", "c": "Onu çok özlüyorum.", "d": "Gözyaşlarını tutamadı."}, "a"),
("37. Hangi cümlede soyut anlam bulunur?",
{"a": "Sevgi her şeyin üstesinden gelir.", "b": "Bardak düştü.", "c": "Pencere kapandı.", "d": "Elini ona uzattı."}, "a"),
("38. Hangi cümlede mecaz anlam bulunmaktadır?",
{"a": "Sözleri kalbimi deldi geçti.", "b": "Kapıyı kapattı.", "c": "Kitap masada duruyordu.", "d": "Gözleri ışıl ışıl parlıyordu."}, "a"),
("39. Hangi cümlede terim anlam bulunmaktadır?",
{"a": "Matematikte fonksiyonlar anlatılır.", "b": "Onu çok özledim.", "c": "Sevgisini göstermek istedi.", "d": "Kapıyı açtı."}, "a"),
("40. Hangi ifade somut anlam içerir?",
{"a": "Sevgisini dile getirdi.", "b": "Kitabı rafa koydu.", "c": "İçimde derin bir özlem var.", "d": "Kalbimde sevgi var."}, "b")
]
# Soruları karıştırın
random.shuffle(questions)
# Sayaçlar ve listeler
correct_answers = 0
wrong_answers = 0
current_question_index = 0
correct_answer_list = []
user_answers = [] # Kullanıcının seçtiği cevapları kaydeder
total_score = 0 # Toplam puan
# Geçme puanı ve doğru cevap başına puan
PASS_SCORE = 75
POINTS_PER_CORRECT_ANSWER = 2.5
# Kullanıcı bilgileri için sözlük
user_info = {}
# PDF oluşturma fonksiyonu
def create_certificate():
c = canvas.Canvas("ustun_basari_belgesi.pdf", pagesize=A4)
width, height = A4
# Renkli Çerçeve
c.setFillColor(colors.darkblue)
c.rect(50, height - 300, width - 100, 250, fill=1, stroke=0)
c.setFillColor(colors.pink)
c.rect(60, height - 290, width - 120, 230, fill=1, stroke=0)
# Başlık
c.setFont("Helvetica-Bold", 20)
c.setFillColor(colors.black)
c.drawCentredString(width / 2, height - 100, "ÜSTÜN BAŞARI BELGESİ")
# Kullanıcı Bilgileri
c.setFont("Helvetica", 12)
c.drawString(80, height - 150, f"Öğrencinin Adı Soyadı: {user_info['name']}")
c.drawString(80, height - 170, f"Okul Numarası: {user_info['number']}")
c.drawString(80, height - 190, f"Sınıfı: {user_info['class']}")
c.drawString(80, height - 210, f"Okul Adı: {user_info['school']}")
# Başarı Mesajı
c.drawString(80, height - 250, "Türkçe Dersi Sınavı'nı başarılı bir biçimde geçmiştir.")
# İmza alanı
c.drawString(width - 200, 100, "OKUL MÜDÜRÜ")
# PDF kaydet
c.save()
# PDF'yi otomatik olarak aç
os.startfile("ustun_basari_belgesi.pdf")
# Sonuçları gösteren pencere
def show_results():
result_window = tk.Toplevel(root)
result_window.title("Sınav Sonuçları")
result_window.geometry("800x400")
# Başlık
result_title = tk.Label(result_window, text="Test Tamamlandı!", font=("Arial", 16, "bold"))
result_title.pack(pady=10)
# Puan ve geçme durumu
if total_score >= PASS_SCORE:
message_frame = tk.Frame(result_window, bg="#d4edda", bd=2, relief="solid")
message = tk.Label(message_frame, text=f"Tebrikler! Sınavı geçtiniz.\nToplam Puan: {total_score}",
font=("Arial", 12), bg="#d4edda")
create_certificate() # Başarı belgesini oluştur
else:
message_frame = tk.Frame(result_window, bg="#f8d7da", bd=2, relief="solid")
message = tk.Label(message_frame, text=f"Maalesef, sınavı geçemediniz.\nToplam Puan: {total_score}",
font=("Arial", 12), bg="#f8d7da")
message_frame.pack(pady=10, fill="x", padx=20)
message.pack(pady=5)
# Treeview ile doğru ve yanlış cevapları listeleme
tree_frame = tk.Frame(result_window)
tree_frame.pack(fill="both", expand=True, padx=20, pady=10)
tree = ttk.Treeview(tree_frame, columns=("Soru", "Durum", "Doğru Cevap", "Seçilen Şık"), show="headings", height=10)
tree.heading("Soru", text="Soru")
tree.heading("Durum", text="Durum")
tree.heading("Doğru Cevap", text="Doğru Cevap")
tree.heading("Seçilen Şık", text="Seçilen Şık")
tree.column("Soru", width=200)
tree.column("Durum", width=100)
tree.column("Doğru Cevap", width=100)
tree.column("Seçilen Şık", width=100)
for i, question in enumerate(questions):
correct_answer = question[2]
user_answer = user_answers[i] if i < len(user_answers) else ""
status = "Doğru" if user_answer == correct_answer else "Yanlış"
tree.insert("", "end", values=(f"Soru {i + 1}", status, correct_answer.upper(), user_answer.upper()))
# Treeview stili ayarlama
style = ttk.Style()
style.configure("Treeview.Heading", font=("Arial", 10, "bold"))
style.configure("Treeview", font=("Arial", 10), rowheight=25)
tree.pack(fill="both", expand=True)
# Tamam butonu
btn_close = tk.Button(result_window, text="Kapat", command=result_window.destroy, bg="#007bff", fg="white", font=("Arial", 12))
btn_close.pack(pady=10)
# Kullanıcı bilgileri formu
def show_user_info_form():
form = tk.Toplevel(root)
form.title("Kullanıcı Bilgileri")
form.geometry("400x300")
tk.Label(form, text="Adı Soyadı:").pack(pady=5)
name_entry = tk.Entry(form)
name_entry.pack()
tk.Label(form, text="Okul Numarası:").pack(pady=5)
number_entry = tk.Entry(form)
number_entry.pack()
tk.Label(form, text="Okul Sınıfı:").pack(pady=5)
class_entry = tk.Entry(form)
class_entry.pack()
tk.Label(form, text="Okul Adı:").pack(pady=5)
school_entry = tk.Entry(form)
school_entry.pack()
def save_user_info():
user_info['name'] = name_entry.get()
user_info['number'] = number_entry.get()
user_info['class'] = class_entry.get()
user_info['school'] = school_entry.get()
form.destroy()
start_test() # Testi başlat
tk.Button(form, text="Kaydet ve Başla", command=save_user_info).pack(pady=10)
# Başlangıç ekranı
def start_test():
start_frame.pack_forget()
quiz_frame.pack(fill="both", expand=True)
update_question()
# Soru metni ve seçenekleri güncelle
def update_question():
global current_question_index, questions
question, options, correct = questions[current_question_index]
question_label.config(text=question)
option_a.config(text=f"A) {options['a']}")
option_b.config(text=f"B) {options['b']}")
option_c.config(text=f"C) {options['c']}")
option_d.config(text=f"D) {options['d']}")
selected_answer.set(None)
progress_var.set(correct_answers) # Doğru cevap çubuğunu güncelle
# Cevap kontrolü
def check_answer():
global correct_answers, wrong_answers, current_question_index, total_score
question, options, correct = questions[current_question_index]
user_answer = selected_answer.get()
if user_answer == correct:
correct_answers += 1
total_score += POINTS_PER_CORRECT_ANSWER # Doğru cevaba göre puan ekle
correct_answer_list.append(f"{current_question_index + 1}) {options[correct]}")
progress_var.set(correct_answers) # Doğru cevap çubuğunu güncelle
else:
wrong_answers += 1
wrong_progress_var.set(wrong_answers) # Yanlış cevap çubuğunu güncelle
# Kullanıcının cevabını kaydet
user_answers.append(user_answer)
score_label.config(text=f"Doğru: {correct_answers} | Yanlış: {wrong_answers} | Puan: {total_score}")
current_question_index += 1
if current_question_index < len(questions):
update_question()
else:
show_results()
# Testi yeniden başlatma seçeneği
def restart_test():
global correct_answers, wrong_answers, current_question_index, correct_answer_list, total_score, user_answers
correct_answers = 0
wrong_answers = 0
current_question_index = 0
correct_answer_list.clear()
user_answers.clear()
total_score = 0
random.shuffle(questions)
start_frame.pack(fill="both", expand=True)
quiz_frame.pack_forget()
# Ana pencereyi oluşturun
root = tk.Tk()
root.title("Türkçe Testi")
root.geometry("600x500")
# Başlangıç ekranı arayüzü
start_frame = tk.Frame(root)
start_frame.pack(fill="both", expand=True)
welcome_label = tk.Label(start_frame, text="Türkçe Testi'ne Hoşgeldiniz", font=("Arial", 16))
welcome_label.pack(pady=20)
start_button = tk.Button(start_frame, text="Kullanıcı Bilgilerini Gir ve Başla", command=show_user_info_form, font=("Arial", 12), bg="lightgreen")
start_button.pack(pady=20)
# Test ekranı arayüzü
quiz_frame = tk.Frame(root)
question_label = tk.Label(quiz_frame, text="", wraplength=500, font=("Arial", 12))
question_label.pack(pady=20)
selected_answer = tk.StringVar()
option_a = tk.Radiobutton(quiz_frame, text="", variable=selected_answer, value="a", font=("Arial", 10))
option_a.pack(anchor="w")
option_b = tk.Radiobutton(quiz_frame, text="", variable=selected_answer, value="b", font=("Arial", 10))
option_b.pack(anchor="w")
option_c = tk.Radiobutton(quiz_frame, text="", variable=selected_answer, value="c", font=("Arial", 10))
option_c.pack(anchor="w")
option_d = tk.Radiobutton(quiz_frame, text="", variable=selected_answer, value="d", font=("Arial", 10))
option_d.pack(anchor="w")
next_button = tk.Button(quiz_frame, text="Sonraki Soruya Geç", command=check_answer, font=("Arial", 12), bg="lightblue")
next_button.pack(pady=20)
# Doğru cevaplar için ilerleme çubuğu
progress_var = tk.IntVar()
progress_bar = ttk.Progressbar(quiz_frame, variable=progress_var, maximum=40)
progress_bar.pack(fill="x", padx=20, pady=5)
# Yanlış cevaplar için kırmızı ilerleme çubuğu
wrong_progress_var = tk.IntVar()
wrong_progress_bar = ttk.Progressbar(quiz_frame, variable=wrong_progress_var, maximum=40, style="red.Horizontal.TProgressbar")
wrong_progress_bar.pack(fill="x", padx=20, pady=5)
# Yanlış cevap çubuğunu kırmızı yapmak için stil ayarla
style = ttk.Style()
style.configure("red.Horizontal.TProgressbar", troughcolor="gray", background="red")
# Skor göstergesi
score_label = tk.Label(quiz_frame, text=f"Doğru: {correct_answers} | Yanlış: {wrong_answers} | Puan: {total_score}", font=("Arial", 10))
score_label.pack()
# İlk soruyu yükle
root.mainloop()