2025-10-18

Python tkinter felvillanó gombok játék.

 

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


class FelvillanoGombok(ttk.Frame):
def __init__(self, container, masterapp):
super().__init__(container, width=400, height=500)

self.masterapp = masterapp # az App példány elérhető
self.stilus = ttk.Style()
self.stilus.theme_use('clam')
self.stilus.configure('TFrame', background='black')
self.stilus.configure('TButton', background='grey')
self.stilus.configure('Kiemeles.TButton',
background='#EEEEEE')

self.hibas_valasz = 0
self.helyes_valasz = 0
self.piros_sziv = '\U0001F49C'
self.zold_sziv = '\U0001F49A'

self.gombok = []
self.kattintott_gomb = None
self.villantott_gomb_pozicio = (-1, -1)

self._gombok_keszites()
self._label_keszitesek()

# most nem a fő ablakra, hanem a játékframe-re bindelünk
self.bind_all('<Return>', self.inditsd_a_villogast)
self.focus_set()

def _gombok_keszites(self):
for row_val in range(5):
sor_gombok = []
for col_val in range(4):
button = ttk.Button(
self, text="\n", width=5,
command=lambda r=row_val, c=col_val:
self.gombra_kattintott(r, c)
)
button.grid(row=row_val, column=col_val,
sticky="nsew", padx=2, pady=2)
sor_gombok.append(button)
self.gombok.append(sor_gombok)

def _label_keszitesek(self):
self.utasit_label = ttk.Label(
self, text='Kezdéshez nyomd meg az ENTER-t',
width=30, anchor='center', background='black',
foreground='white')
self.utasit_label.grid(row=5, column=0, columnspan=4,
padx=2, pady=1, sticky='ew')

self.jo_valasz_label = ttk.Label(self, text='',
background='black')
self.jo_valasz_label.grid(row=6, column=0, columnspan=4,
padx=2, pady=1, sticky='ew')

self.rossz_v_label = ttk.Label(self, text='',
background='black')
self.rossz_v_label.grid(row=7, column=0, columnspan=4,
padx=2, pady=1, sticky='ew')

def inditsd_a_villogast(self, event):
"""AZÉRT SZÜKSÉGES AZ event-ET HASZNÁLNI VALAMIRE,
MERT A PyCharm KÜLÖNBEN HIBÁT JELEZ!!! ÍGY NEM!!!
Állítólag az aláhúzás _ jel is jó erre a célra az event helyett.
Viszont nem értem, akkor miért nem használja senki?"""
if self.kattintott_gomb and event:
return
if self.helyes_valasz >= 15 or self.hibas_valasz >= 15:
return

random_sor = random.randrange(len(self.gombok))
random_osz = random.randrange(len(self.gombok[0]))
gomb_villanas = self.gombok[random_sor][random_osz]
self.villantott_gomb_pozicio = (random_sor, random_osz)
gomb_villanas.config(style='Kiemeles.TButton')
self.kattintott_gomb = gomb_villanas
self.after(250, self.allitsd_vissza_a_szint,
self.kattintott_gomb)

def gombra_kattintott(self, katt_sor, katt_osz):

if (self.helyes_valasz >= 15 or self.hibas_valasz >= 15 or
self.kattintott_gomb is None):

if self.kattintott_gomb is None:
tk.messagebox.showerror('Hiba!',
'Enter lenyomása következik!')
return

if (katt_sor, katt_osz) == self.villantott_gomb_pozicio:
self.helyes_valasz += 1
self.jo_valasz_label.config(
text=f'{self.zold_sziv * self.helyes_valasz}')
else:
self.hibas_valasz += 1
self.rossz_v_label.config(
text=f'{self.piros_sziv * self.hibas_valasz}')

self.villantott_gomb_pozicio = (-1, -1)
self.kattintott_gomb = None
self.utasit_label.config(text='Újra ENTER-t a villanáshoz!')
self.jatek_vege()

def allitsd_vissza_a_szint(self, jelenlegi_kiemelt_gomb):
if jelenlegi_kiemelt_gomb:
jelenlegi_kiemelt_gomb.config(style='TButton')
self.utasit_label.config(text='Kattints a felvillant gombra!')

def jatek_vege(self):
if self.helyes_valasz >= 15:
tk.messagebox.showinfo('Vége!',
f'{self.helyes_valasz} helyes találat!')
self.utasit_label.config(text='Nyomj Új játék gombot!')
elif self.hibas_valasz >= 15:
tk.messagebox.showinfo('Vége!',
f'{self.hibas_valasz} hibás jelölés!')
self.utasit_label.config(text='Nyomj Új játék gombot!')


class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("258x420+800+100")

# felső és alsó keret külön
self.felso_keret = ttk.Frame(self)
self.felso_keret.pack(fill='both', expand=True)

self.also_keret = ttk.Frame(self)
self.also_keret.pack(fill='x')

# játékmező a felső keretben
self.flv_gombok = FelvillanoGombok(self.felso_keret, self)
self.flv_gombok.pack(fill='both', expand=True)

# gomb az alsó keretben
ttk.Button(self.also_keret, text='Új játék',
command=self.ujra).pack(pady=10)

def ujra(self):
# előző játékpanel törlése és új példány a felső keretbe
self.flv_gombok.destroy()
self.flv_gombok = FelvillanoGombok(self.felso_keret, self)
self.flv_gombok.pack(fill='both', expand=True)


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

Felvillanó gomb

Nincsenek megjegyzések:

Megjegyzés küldése