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