Naslednji GUI program bo igra spomina. Ta program bo služil kot zgled, kako uporabljamo rokovalnik dogodka miškin klik, ki se zgodi, ko z miško kliknemo na določeno mesto na platnu.
Ogledali si bomo, kako ugotovimo na katero mesto na platnu smo kliknili ter kako ta podatek uporabimo za ustrezno delovanje oziroma odzivanje programa.
Program bomo poenostavili do te mere, da bodo na ploščicah posamezne številke. Par bosta predstavljali ploščici, ki bosta vsebovali isto številko. Šteli pa bomo tudi skupno število potez, ki jih bo naredil uporabnik.
Program lahko razširiš tako, da bodo ploščice namesto številk vsebovale sličice. Druga razširitev pa je lahko v tem, da program izriše ploščice v mreži (na primer 4x4).
Pomembna podrobnost bo tudi v tem, da bomo morali ploščice naključno premešati. Ta program bo torej služil tudi kot zgled, kako uporabljamo modul random
.
Izgled GUI vmesnika našega programa bo podoben spodnjemu modelu, le da bo vseboval 16 ploščic (namesto 8, kot je prikazano spodaj).
1 # encoding: utf-8 2 import tkinter as tk 3 import random 4 5 # Definicija globalnih spremenljivk 6 VEL = 48 # velikost ploščice (npr. 48x48) 7 ROB = 8 # rob/obroba med ploščicami 8 stanje = 0 # globalno stanje igre 9 poteza = 0 # globalni števec potez 10 11 SIRINA = (ROB+VEL) * 16 + ROB 12 VISINA = (ROB+VEL) * 2 13 14 # Nariše zakrite in odkrite ploščice 15 def narisi(platno): 16 global VEL, ROB 17 global komplet, odkrito 18 for i in range(16): 19 KORAK = ROB // 4 + (ROB+VEL) * i 20 platno.create_polygon( 21 [(KORAK+ROB, ROB), 22 (KORAK+ROB+VEL, ROB), 23 (KORAK+ROB+VEL, ROB+VEL), 24 (KORAK+ROB, ROB+VEL) 25 ], width=VEL // 2, fill="darkgreen") 26 if (odkrito[i]): 27 polozaj = (KORAK+ROB+VEL // 2, ROB+VEL // 2) 28 platno.create_text(polozaj, fill="white", \ 29 text=str(komplet[i]), font=("Times", VEL // 2)) 30 31 # Rokovalnik za klik miške na gumb 'Znova' 32 def znova(): 33 global komplet, odkrito, stanje 34 global poteza, prva, druga 35 stanje = 0 # Ponastavi globalno stanje igre 36 poteza = 0 # Ponastavi globalni števec potez 37 napis.configure(text="Št. potez = 0") # Ponastavi napis 38 odkrito = [False]*16 # Vse ploščice so neodkrite 39 ploscice = list(range(8)) 40 # Komplet sestavljata dve množici ploščic 41 komplet = ploscice + ploscice 42 random.shuffle(komplet) # Premešaj komplet 43 prva = -1 # Prva izbrana ploščica 44 druga = -1 # Druga izbrana ploščica 45 narisi(platno) 46 47 # Rokovalnik za klik miške na ploščico 48 def klik(polozaj): 49 global komplet, odkrito, stanje 50 global poteza, prva, druga 51 global VEL, ROB, platno 52 # Preveri, katera ploščica je bila kliknjena 53 if (polozaj.y > ROB and polozaj.y <= ROB+VEL): 54 trenutna = polozaj.x // (ROB+VEL) 55 if (not odkrito[trenutna]): 56 odkrito[trenutna] = True 57 if stanje == 0: 58 stanje = 1 59 prva = trenutna 60 elif stanje == 1: 61 stanje = 2 62 druga = trenutna 63 poteza += 1 # Posodobi števec potez 64 napis.configure(text="Št. potez = " + str(poteza)) 65 else: 66 stanje = 1 67 if (komplet[prva] != komplet[druga]): 68 odkrito[prva] = False 69 odkrito[druga] = False 70 prva = trenutna 71 narisi(platno) 72 73 # Ustvari okno, okvir in platno 74 okno = tk.Tk() 75 okno.title("Spomin") 76 okno.geometry(str(SIRINA + 190) + "x" + str(VISINA + 40)) 77 78 okvir = tk.Frame(okno) 79 okvir.grid(row=0, column=0, pady=20) 80 81 # Poveži funkcije z dogodkovnimi rokovalniki 82 platno = tk.Canvas(okno, width=SIRINA, height=VISINA) 83 platno.configure(bg="black") 84 platno.bind("<Button-1>", klik) # Klik na levi gumb miške 85 platno.grid(row=0, column=1, pady=20) 86 87 gumb = tk.Button(okvir, text="Znova", command=znova) 88 gumb.configure(width=10) 89 gumb.grid(row=0, column=0, padx=45) 90 91 napis = tk.Label(okvir, text="Št. potez = 0") 92 napis.grid(row=1, column=0) 93 94 # Poženi celotno zadevo 95 znova() 96 okno.mainloop() 97