Favicon
NSI Première

Connexion

Choisir le(s) module(s) à installer :

IHM/Tkinter - Correction

En programmation évènementielle, il est primordial de bien séparer :

  • le code de création de l'interface graphique
  • la "logique" du programme, c'est à dire les instructions de traitement

Surtout ne pas appuyer...


from tkinter import *

# GESTIONNAIRE D'ENVENEMENT "CLIC BOUTON"
def appui():
    '''Rôle de cette fonction :
    UNIQUEMENT modifier le texte dans les étiquettes,
    surtout pas de CREER des widgets !!
    '''

    texte1.set("Fallait pas appuyer...")
    texte2.set("BOUM !!")


# INTERFACE
fen = Tk()
fen.title("ATTENTION")

b = Button(fen, text = "DANGER", command = appui)
b.grid(row = 0, column = 0)

texte1 = StringVar()                                    # variable de contrôle associée à l'étiquette du bas
texte1.set("Surtout ne pas appuyer sur ce bouton !")
l1 = Label(fen, textvariable = texte1)
l1.grid(row = 1, column = 0)

texte2 = StringVar()                                    # variable de contrôle associée à l'étiquette à droite
texte2.set("")                                          # pour l'instant, rien n'est affiché dans cette étiquette
l2 = Label(fen, textvariable = texte2)
l2.grid(row = 0, column = 1)

fen.mainloop()
			

Le jeu du nombre à deviner


from tkinter import *
from random import randint

nombre = randint(1, 100)

# GESTIONNAIRE D'EVENEMENT
def evaluer():
    entree = int(prop.get())    # lecture de l'entrée utilisateur, et conversion en entier

    if entree < nombre:
        r.set("Trop petit")
    elif entree > nombre:
        r.set("Trop grand")
    else:
        r.set('BRAVO !')

# INTERFACE
fen = Tk()

fen.title('Nombre à deviner')

prop = Entry(fen)               # champ d'entrée de la proposition utilisateur
prop.pack()

val = Button(fen, text ='OK', command = evaluer)
val.pack()

r = StringVar()
res = Label(fen, textvariable = r)
res.pack()

fen.mainloop()
			

Mini-projet : le morpion


from tkinter import *

def joue(event):    # 'event' est un argument passé implicitement au gestionnaire d'évènement lors du clic souris
    global joueur   # rend "globale la variable 'joueur', c'est à dire permet de modifier une variable définie dans le programme principal

    ligne = (event.y) // 100    # calcul du numéro de ligne
    colonne = (event.x) // 100  # et de colonne du clic

    if grille[ligne][colonne] == 0 :        # si la case n'a pas encore été jouée
        grille[ligne][colonne] = joueur     # alors on indique quel joueur aura joué dans cette case.
        if joueur == 1:                     # si le joueur courant est le joueur 1,
            can.create_line(colonne*100 + 10,ligne*100+10,colonne*100+90,ligne*100+90,fill='white', width = 5) # alors on trace une croix dans la case,
            can.create_line(colonne*100+10,ligne*100+90,colonne*100+90,ligne*100+10,fill='white', width = 5)
            joueur = 2  # et on change de joueur.
        else:
            can.create_oval(colonne*100 + 10,ligne*100+10,colonne*100+90,ligne*100+90,outline='white', width = 5) # sinon, on trace un cercle dans la case,
            joueur = 1 # et on change de joueur



# INITIALISATION DU JEU
grille = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]  # matrice représentant la grille du jeu; utlisée pour savoir si une case est déja jouée. 0 = case vide, 1 = joueur 1, 2 = joueur 2
joueur = 1                                  # joueur courant; le joueur 1 ( = ronds ) joue en premier


# INTERFACE
fen = Tk()

fen.title('Morpion')

can = Canvas(fen, width = 300, height = 300, background='black')    # canevas = zone de dessin
can.pack()

can.bind('', joue)                                        # association de l'évènement 'clic bouton gauche souris' au gestionnaire d'évènement 'joue'

# tracé des lignes de la grille
can.create_line(100,10,100,290,fill='white', width = 3)
can.create_line(200,10,200,290,fill='white', width = 3)
can.create_line(10,100,290,100,fill='white', width = 3)
can.create_line(10,200,290,200,fill='white', width = 3)

fen.mainloop()