2025-11-23

Python képek kvíz, wrapper függvénnyel.

 

# Tobikoz képe a Pixabay -on.
# WOKANDAPIX képe a Pixabay -on.
# Erika R. képe a Pixabay -en.
# Sergey Gricanov képe a Pixabay -on.
# Waleed Khalid képe a Pixabay -on.

import tkinter as tk
import time
from PIL import Image, ImageTk
import sys

def allapotfrissites(func):
"""Állapotjelző dekorátor (Megjeleníti a képet a művelet alatt)."""
def wrapper(self):
# A kód 427x640 pixel méretű álló képekre optimalizált!
kep_nevek = ['bohóc', 'parrot', 'tojás', 'út2', 'úton']

# Kép indexének használata a név kiválasztásához (biztosan a listán belül)
kep_index = self.aktualis_kep_index % len(kep_nevek)

# Kép betöltése és konvertálása
try:
self.image_pil = Image.open(f'fotok/{kep_nevek[kep_index]}.jpg')
self.image_tk = ImageTk.PhotoImage(self.image_pil)
# Kép beállítása a Label-be
self.kep_label.configure(image=self.image_tk, text='')
# Ez biztosítja, hogy a Tkinter megtartsa a kép referenciáját.
self.kep_label.image = self.image_tk
except Exception as e:
# Ha nem találja a képet, megjelenít egy hibaüzenetet szövegként
self.kep_label.configure(text=f"Kép betöltési hiba: {e}", image='')
self.kep_label.image = None

# Jegyezzük meg, melyik kép volt legutóbb megjelenítve (a kérdéshez)
self.legutobbi_kep_index = kep_index

# Index növelése, hogy a következő kép következzen
self.aktualis_kep_index += 1

# Frissítjük a GUI-t
self.update_idletasks()

# Hívjuk az eredeti (dekorált) függvényt
eredmeny = func(self)

return eredmeny

return wrapper


class VarakozoFeladatApp(tk.Tk):
def __init__(self):
super().__init__()
self.jelenlegi_helyes = None
self.title('Figyelmes figyelő játék')
self.configure(bg='#B6B6B4')
self.geometry('670x654+500+50')

# A képekhez és kérdésekhez tartozó adatok (sorrend számít)
# mindegyik tuple: (kep_nev, kerdes, helyes_valasz)
# A kód 427x640 pixel méretű álló képeket használ!
self.kep_adatok = [
('bohóc', 'A bohóc cipője piros?', 'Nem'),
('parrot', 'A papagáj csőrén van narancs szín?', 'Igen'),
('tojás', 'A tojás tíz darab?', 'Nem'),
('út2', 'Képen a nap balról süt?', 'Igen'),
('úton', 'Az út széle hullámos?', 'Igen'),
]

# Választó változó (StringVar, hogy 'Igen'/'Nem' lehessen)
self.i_n_valasztas = tk.StringVar()
self.i_n_valasztas.set('') # kezdetben nincs választás

# pontozás
self.pontok = 0
self.rb_szinek = ['#B87333', '#966F33']

# kép frame----------------------------------------------------------
self.kep_frame = tk.Frame(self, width=420, height=640, bd=1,
relief='sunken',
bg="#34282C")
self.kep_frame.pack(fill='both', expand=True, side='left')

# Ez a label jeleníti meg a képet.
self.kep_label = tk.Label(self.kep_frame, text=f"Itt jelenik meg a kép!",
bg="#34282C", fg="white", wraplength=400,
justify='center')
self.kep_label.pack(fill='both', expand=True)

# Képindex (melyik következik megmutatni)
self.aktualis_kep_index = 0
# Legutóbb megjelenített kép indexe (kezdéskor nincs)
self.legutobbi_kep_index = None

# widgetek frame---------------------------------------------------------
self.frame = tk.Frame(self, width=252, height=640, bd=2, relief='sunken',
bg="#34282C")
self.frame.pack(fill='both', expand=True)

# Button - mutatja a képet 5 mp-re
self.kepmutato_gomb = tk.Button(self.frame, bg='#00FF00',
text="Kép mutatás 5 mp", width=21,
command=self.gomb_szoveg_valtozas)
self.kepmutato_gomb.grid(row=0, column=0, columnspan=2, padx=10, pady=10)

# Button - kérdés felhozása
self.kerdes_gomb = tk.Button(self.frame, state='disabled', bg='#FFFF00',
text="Kérdés a képről", width=21,
command=self.kerdeseket_kap)
self.kerdes_gomb.grid(row=1, column=0, columnspan=2, padx=10, pady=10)

# Label - itt jelenik meg a kérdés
self.kerdes_label = tk.Label(self.frame, width=23, height=4,
relief='sunken', bg='#FFFF00',
text='Itt lesz a kérdés',
wraplength=180, justify='left')
self.kerdes_label.grid(row=2, column=0, columnspan=2, padx=10,
pady=(10, 20), ipadx=4, ipady=4)

# Radiobuttonok Igen / Nem
for i, valasztott in enumerate(['Igen', 'Nem']):
tk.Radiobutton(self.frame, width=7, fg='black',
height=2, bg=self.rb_szinek[i],
text=valasztott,
padx=1,
variable=self.i_n_valasztas,
value=valasztott).grid(row=3, column=i, padx=5, pady=(0, 10))

# Button - kiértékelés
self.kiertekel_gomb = tk.Button(self.frame, width=21, bg='#FFA62F',
text='Kiértékelő', command=self.kiertekeles,
state='disabled')
self.kiertekel_gomb.grid(row=4, column=0, columnspan=2, padx=10, pady=10)

# Label - pontok
self.pont_label = tk.Label(self.frame, width=23, relief='sunken',
bg='#6AFB92',
text=f'Pontok: {self.pontok}')
self.pont_label.grid(row=5, column=0, columnspan=2, padx=10, pady=10,
ipadx=4, ipady=4)

# Info / visszajelzés mező
self.uzenet_label = tk.Label(self.frame, width=23, height=3, relief='flat',
text='', wraplength=180, justify='left',
bg="#34282C", fg="white")
self.uzenet_label.grid(row=6, column=0, columnspan=2, padx=10, pady=(5, 0))

self.kilep_gomb = tk.Button(self.frame, width=21, bg='red',
text='Kilépés', command=sys.exit)
self.kilep_gomb.grid(row=7, column=0, columnspan=2, padx=10, pady=10)

# -------------------------------------------------------------------------------------------------
def gomb_szoveg_valtozas(self):
"""Kép megjelenítése 5 másodpercre (gomb kezeli az állapotot)"""
self.kepmutato_gomb['text'] = 'Várj a kép eltűnéséig!'
# tiltjuk a kérdés gombot, amíg a feladat fut
self.kerdes_gomb.configure(state='disabled')
self.kepmutato_gomb.configure(state='disabled')
# mutatjuk a képet (a dekorátor tölti be és beállítja a legutóbbi indexet)
self.feladat_elvegzes()
# miután vége, visszaállítjuk a gombot és engedélyezzük a kérdés gombot
self.kepmutato_gomb['text'] = 'Kép mutatás 5 mp'
self.kepmutato_gomb.configure(state='normal')
self.kerdes_gomb.configure(state='normal')
# töröljük előző választ/üzeneteket
self.i_n_valasztas.set('')
self.kiertekel_gomb.configure(state='disabled')
self.uzenet_label.configure(text='')

@allapotfrissites
def feladat_elvegzes(self):
"""A tényleges 'hosszú' feladat — itt egyszerűen várunk 5 mp-et"""
# idő alatti tiltásokat a hívó már elvégezte
time.sleep(5)
# eltüntetjük a képet
self.kep_label.configure(image='')
self.kep_label.image = None

def kerdeseket_kap(self):
"""Gomb nyomásra megjelenik az adott képhez tartozó kérdés"""
self.kerdes_gomb.configure(state='disabled')

if self.legutobbi_kep_index is None:
self.kerdes_label.configure(text='Nincs megjelenített kép.')
return

# lekérjük a kérdést az adatokból
_, kerdes, helyes_valasz = self.kep_adatok[self.legutobbi_kep_index]
self.kerdes_label.configure(text=kerdes)
# elmentjük a jelenlegi helyes választ
self.jelenlegi_helyes = helyes_valasz
# engedélyezzük a kiértékelő gombot, választásra várunk
self.kiertekel_gomb.configure(state='normal')
# töröljük a választ (ha korábban maradt)
self.i_n_valasztas.set('')
self.uzenet_label.configure(text='Válassz Igen vagy Nem, '
'majd nyomd meg a Kiértékelő gombot.')

def kiertekeles(self):
"""Kiértékeli a választ és frissíti a pontszámot."""
valasz = self.i_n_valasztas.get()
if not valasz:
self.uzenet_label.configure(text='Nincs választás — válassz Igen vagy Nem!')
return

# összehasonlítjuk a jelenlegi helyes válasszal
if valasz == self.jelenlegi_helyes:
# jó válasz -> +1 pont
self.pontok += 1
self.uzenet_label.configure(text=f'Jó válasz! +1 pont.')
else:
# rossz válasz -> 0 pont
self.pontok -= 0
self.uzenet_label.configure(
text=f'Rossz válasz. 0 pont.\nHelyes valasz: {self.jelenlegi_helyes}')

# frissítjük a pontok feliratot
self.pont_label.configure(text=f'Pontok: {self.pontok}')

# lezárjuk a kiértékelést, következő kép mutatásáig ne lehessen újra értékelni
self.kiertekel_gomb.configure(state='disabled')
# A kérdés gombot engedjük, hogy a felhasználó újra kérdezzen a következő képhez majd
# (vagy dönthetsz úgy, hogy addig maradjon tiltva)
# self.kerdes_gomb.configure(state='normal')

# röviden jelezzük melyik kép kérdésére válaszoltunk (opcionális)
self.uzenet_label.configure(
text=self.uzenet_label.cget(
'text') + f'\nA kérdés {self.legutobbi_kep_index+1}. képhez tartozott.')


if __name__ == "__main__":
app = VarakozoFeladatApp()
app.mainloop()

Layco