2025-11-02

Felvillanó négyzetek játék. Python 3.12, tkinter, Linux Mint, PyCharm.

 A villantó gomb lenyomása után 1 másodpercre felvillannak, az előzőleg beállított számú négyzetek. Ez követően jön az egér bal gombjával  a találgatás. Találat narancs színre festi a négyzetet, a nem találat pirosra. Következik a Kiértékel gomb és az eredmény leolvasása. Jó szórakozást! 

 Érdekesség lehet a PanedWindow használat megértése.


import sys
import tkinter as tk
from tkinter import ttk, messagebox as msg
import random


class HuszNegyzet(tk.Canvas):
def __init__(self, container, applikacio):
super().__init__(container, width=284, height=354,
bg='#837E7C', highlightthickness=0)
self.app = applikacio # <-- Itt tároljuk el az Applikacio példányt
self.negyzet_obj_idk = []
self.eredeti_szin = "#25383C"
self.villantott_negyzetek = []
self.eger_kattintas_idk = []
self.helyes_valasz = 0
self.rossz_valasz = 0
self.negyzetek4x5()
self.bind("<Button-1>", self.negyzetre_kattintas)

def negyzetek4x5(self):
self.negyzet_obj_idk.clear()
padding = 5
cell = 65
gap = 5
for j in range(5):
for i in range(4):
x1 = padding + i * (cell + gap)
y1 = padding + j * (cell + gap)
x2 = x1 + cell
y2 = y1 + cell
obj_id = self.create_rectangle(x1, y1, x2, y2,
fill=self.eredeti_szin, outline='')
self.negyzet_obj_idk.append(obj_id)

def villant(self, darabszam):
darabszam = max(1, min(darabszam, len(self.negyzet_obj_idk)))

self.villantott_negyzetek = random.sample(
self.negyzet_obj_idk, k=darabszam)

for obj_id in self.villantott_negyzetek:
self.itemconfig(obj_id, fill="white")

self.after(1000,
self.visszaallit, list(self.villantott_negyzetek))

def visszaallit(self, negyzet_idk):
for obj_id in negyzet_idk:
self.itemconfig(obj_id, fill=self.eredeti_szin)

def negyzetre_kattintas(self, event):
katt_jo_szin = 'orange'
katt_rossz_szin = 'red'

kattintott_id = self.find_closest(event.x, event.y)[0]

if kattintott_id in self.villantott_negyzetek:
self.itemconfig(kattintott_id, fill=katt_jo_szin)
else:
self.itemconfig(kattintott_id, fill=katt_rossz_szin)
self.eger_kattintas_idk.append(kattintott_id)

if len(self.eger_kattintas_idk) == len(self.villantott_negyzetek):
eredmeny = (sorted(self.eger_kattintas_idk) ==
sorted(self.villantott_negyzetek))

# Egér kattintás zárva
self.unbind("<Button-1>")

if eredmeny:
# msg.showinfo("Eredmény", "Ügyes vagy, mindet eltaláltad!")
self.helyes_valasz += 1
# Mivel a gomb az Applikációban van ezért a self.app.button_kiértékel...
self.app.button_kiertekel.configure(state='normal')

else:
# Mivel a gomb az Applikációban van ezért a self.app.button_kiértékel...
self.app.button_kiertekel.configure(state='normal')
# msg.showwarning("Eredmény", "Nem mind volt jó!")
self.rossz_valasz += -1

def ujra_engedelyez(self):
self.eger_kattintas_idk.clear()
self.villantott_negyzetek.clear()
self.helyes_valasz = 0
self.rossz_valasz = 0

for obj_id in self.negyzet_obj_idk:
self.itemconfig(obj_id, fill=self.eredeti_szin)

self.bind("<Button-1>", self.negyzetre_kattintas)


class ComboboxValaszto(ttk.Frame):
def __init__(self, container):
super().__init__(container, style='TFrame')

label = ttk.Label(self,
text="Felvillanó négyzetek?\n(Alap: 2)",
justify='center', style='Combo.TLabel')
label.pack(pady=4)

self.opciok = [f"{i} darab" for i in range(2, 10)]

self.combo = ttk.Combobox(self, values=self.opciok,
state='readonly', justify='center',
font=('Arial', 12))
self.combo.current(0)
self.combo.pack(pady=4)

def aktualis_ertek(self):
return int(self.combo.get().split()[0])


class Applikacio(tk.Tk):
def __init__(self):
super().__init__()

self.title("Játék a felvillanó négyzetekkel")
self.configure(bg='white')
self.geometry('580x470+700+100')

self.helyes_szotar = \
{2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
self.helyes_valasz = 0
self.hibas_szotar = \
{2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
self.hibas_valasz = 0
self.negyzet_db_valasztas = 0

# widgetek inicializálása
self.gombok_frame = None
self.button_kilepes = None
self.button_kiertekel = None
self.button_indito = None
self.hibas_label = None
self.helyes_label = None

# metódus hívás
self.stilus_konfiguralas()

# Osztály példány nevek
self.husz_negyzet = None
self.combobox_valaszto = None
# A harmadik keret
self.vezerlo_frame = None

# Három részre osztott ablak
self.panedwindow_konfiguralas()

# A helyes és a hibás eredmények kijelzője
self.helyes_eredmeny_kijelzo()
self.hibas_eredmeny_kijelzo()

def stilus_konfiguralas(self):
stilus = ttk.Style(self)
stilus.theme_use('clam')

stilus.configure('TFrame',
background='#25383C')

stilus.configure('TPanedwindow',
background='white',
)

stilus.configure('Kijelzo.TLabel', background='#25383C',
foreground='white', font=('Arial', 11))

stilus.configure('Combo.TLabel', background='#25383C',
foreground='white', font=('Arial', 11))

stilus.configure('Villanto.TButton', width=9,
background='#52D017',
foreground='black', font=('Arial', 11))

stilus.map('Villanto.TButton',
background=[('disabled', 'black')],
foreground=[('disabled', 'white')])

stilus.configure('Kiertekel.TButton', width=9,
background='#3090C7',
foreground='black', font=('Arial', 11))

stilus.map('Kiertekel.TButton',
background=[('disabled', 'black')],
foreground=[('disabled', 'white')])

stilus.configure('Kilepes.TButton', width=9,
background='red',
foreground='black', font=('Arial', 11))


stilus.configure("TCombobox",
fieldbackground="#D1D0CE",
background='#52D017',
foreground = 'white',
state = 'readonly')

stilus.map('TCombobox',
fieldbackground=[('readonly', '#25383C')],
selectbackground=[('focus', '#25383C')],
selectforeground=[('focus', 'white')])

def panedwindow_konfiguralas(self):
"""Létrehozza és elrendezi a PanedWindow struktúrát.
"""

# 1. Fő Jobb oldali PanedWindow az Applikációs ablakban
jobb_oldali_paned = ttk.PanedWindow(self,
orient='horizontal')
jobb_oldali_paned.pack(fill='both', expand=True, padx=3, pady=3)

# 2. Bal oldali PanedWindow a jobb oldali PanedWindow-ban.
bal_oldali_paned = ttk.PanedWindow(jobb_oldali_paned,
orient='vertical')
jobb_oldali_paned.add(bal_oldali_paned)

# 3. A self.husz_negyzet Bal oldalra felülre
# HOZZUK LÉTRE ITT A HELYES SZÜLŐVEL (bal_oldali_paned)
self.husz_negyzet = HuszNegyzet(bal_oldali_paned, self)
bal_oldali_paned.add(self.husz_negyzet)

# 4. A self.combobox_valaszto Bal oldalra alulra
# HOZZUK LÉTRE ITT A HELYES SZÜLŐVEL (bal_oldali_paned)
self.combobox_valaszto = ComboboxValaszto(bal_oldali_paned)
bal_oldali_paned.add(self.combobox_valaszto)

# 5. A jobb oldalt teljesen foglalja el
# Harmadik keret a Panedwindow-ban.
self.vezerlo_frame = ttk.Frame(jobb_oldali_paned)
self.widgetek_keszites()
jobb_oldali_paned.add(self.vezerlo_frame, weight=1)

def widgetek_keszites(self):
"""A PanedWindow harmadik keretében lévő widgetek."""
self.helyes_label = ttk.Label(self.vezerlo_frame,
text='Helyes eredmények: 0',
foreground='orange',
style='Kijelzo.TLabel')
self.helyes_label.pack(padx=2, pady=(5, 0))

self.hibas_label = ttk.Label(self.vezerlo_frame,
text='Hibás eredmények: 0',
foreground='#F62217',
style='Kijelzo.TLabel')
self.hibas_label.pack(padx=2, pady=0)

self.gombok_frame = ttk.Frame(self.vezerlo_frame)
self.gombok_frame.pack(padx=2, pady=2)

self.button_indito = ttk.Button(self.gombok_frame,
text='Villantó',
style='Villanto.TButton',
command=self.indit_villantas)
self.button_indito.pack(side='left', padx=2, pady=2)

self.button_kiertekel = ttk.Button(self.gombok_frame,
text='Kiértékel',
state='disabled',
style='Kiertekel.TButton',
command=self.kiertekel)
self.button_kiertekel.pack(side='left', padx=2, pady=2)

self.button_kilepes = ttk.Button(self.gombok_frame,
text='Kilépés',
style='Kilepes.TButton',
command=sys.exit)
self.button_kilepes.pack(side='left', padx=2, pady=2)

def indit_villantas(self):
self.uj_kor()

def uj_kor(self):
self.husz_negyzet.ujra_engedelyez()

self.negyzet_db_valasztas = (
self.combobox_valaszto.aktualis_ertek())

self.husz_negyzet.villant(self.negyzet_db_valasztas)
# indító gomb lezárva
self.button_indito.configure(state='disabled')

def helyes_eredmeny_kijelzo(self):
"""Kizárólag a helyes szótár tartalmának
esztétikus megjelenítését végzi."""

eredmeny_szoveg = (" Helyes megoldások\n"
"Négyzetek : Eredmény\n")

for kulcs, ertek in self.helyes_szotar.items():
eredmeny_szoveg += f" {kulcs} : {ertek} \n"

self.helyes_label.configure(text=eredmeny_szoveg,
justify='center')

def hibas_eredmeny_kijelzo(self):
"""Kizárólag a hibas szótár tartalmának
esztétikus megjelenítését végzi."""

eredmeny_szoveg = (" Hibás megoldások\n"
"Négyzetek : Eredmény\n")

for kulcs, ertek in self.hibas_szotar.items():
eredmeny_szoveg += f" {kulcs} : {ertek} \n"

self.hibas_label.configure(text=eredmeny_szoveg,
justify='center')

def kiertekel(self):
"""A különböző válaszok lekérése után,
a megfelelő szótár kulcshoz
értéket rendelünk."""
# A négyzetekre kattintás eredményének a lekérése
self.helyes_valasz = self.husz_negyzet.helyes_valasz
self.hibas_valasz = self.husz_negyzet.rossz_valasz

if self.helyes_valasz:
# Szótár kulcs - érték frissítés
self.helyes_szotar[self.negyzet_db_valasztas] += self.helyes_valasz
# Megjelenítés: meghívjuk a külön metódust
self.helyes_eredmeny_kijelzo()


elif self.hibas_valasz:
# szótár kilcs - érték frissítés
self.hibas_szotar[self.negyzet_db_valasztas] += self.hibas_valasz
self.hibas_eredmeny_kijelzo()

else:
msg.showwarning('hoppá!', 'Valami kattintási híba lehet!')

# kiértékel gomb lezárva
self.button_kiertekel.configure(state='disabled')
# indító gomb nyitva
self.button_indito.configure(state='normal')


if __name__ == '__main__':
app = Applikacio()
app.mainloop()

 

Layco

 

 

 

Nincsenek megjegyzések:

Megjegyzés küldése