Demande aide pour evenement sur widget Canvas

cs_imothep21 Messages postés 2 Date d'inscription lundi 4 décembre 2006 Statut Membre Dernière intervention 17 mars 2010 - 17 mars 2010 à 01:33
lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 - 18 mars 2010 à 11:14
Bonjour tout le monde,

Donc voila, mon but est de réaliser un jeu de picross (logigraphe) avec python, dans le code ci dessous, j'ai implémenté une fonction qui dessine une grille dans un widget Canvas. La grille est constitué de petits rectangles (qu'on peut leur affecter des id). Mon problerme est le suivant: etant novice en python (et en anglais aussi ) je cherche comment puis je implementer l'evenement clique souris qui permet de noircir une case (un rectangle du canvas) ou la dénoircir, c'est urgent, Merci d'avence pour vos réponses.

Cordialement.

#-*- coding: utf-8 -*-
from Tkinter import *
#-------------------------------------------------------------------------------
def Grille(fen,x,y):
    "Dessine la grille"
    taille_case=20
    canvas Canvas(fen, widthx*taille_case+4, height=y*taille_case+4)

    i = 0
    while i < x:
        j = 0
        while j < y:
            canvas.create_rectangle((i*taille_case)+2,(j*taille_case)+2,((i+1)*taille_case)+2 , ((j+1)*taille_case)+2, fill='white')
            j+=1
        i+=1

    canvas.pack()

#-------------------------------------------------------------------------------
root = Tk()
Grille(root,25,25)
root.mainloop()

From Prolog

3 réponses

lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 73
17 mars 2010 à 19:18
Bonjour,
Le widget "Canvas" n'a pas de méthode qui permette le "clic".
Je pense qu'il est plus simple d'utiliser le widget "Button".

Voici un exemle:
#-*- coding: utf-8 -*-
from Tkinter import *
#-------------------------------------------------------------------------------
def clic_button(num_button):
    lst_num_button[num_button].configure(bg = "grey")

def Grille(fen,x,y):
    "Dessine la grille"
    #"lst_num_button" contient l'identifiant de chaque bouton (instance)
    global lst_num_button
    lst_num_button = []

    i = 0
    while i < x:
        j = 0

        while j < y:
            b Button(fen,height 1, width = 2,
            #(i*x) + j = numéro du bouton de 0 a n
                command lambda num_button (i*x) + j:
                    clic_button(num_button))

            b.grid(row=i,column=j)
            lst_num_button.append(b)
            j+=1

        i+=1

#-------------------------------------------------------------------------------
root = Tk()
Grille(root,25,25)
root.mainloop()
0
cs_imothep21 Messages postés 2 Date d'inscription lundi 4 décembre 2006 Statut Membre Dernière intervention 17 mars 2010
17 mars 2010 à 23:32
Bonjour,

Merci pour votre réponse Lespinx, cela dit on m'a aidé sur un autre forum, et ça marche maintenant, mais je suis à court d'idées, pour appliquer les modifications de la grille au Canvas "Aperçu" (voir code ci dessous), avez vous des propositions? Merci Encore.

#-*- coding: utf-8 -*-
from Tkinter import *
#-------------------------------------------------------------------------------
def Grille(fen,x,y):
    def onClick(event):
        monitem = canvas.find_closest(canvas.canvasx(event.x), canvas.canvasy(event.y))
        if canvas.itemcget(monitem, 'fill') == 'white':
            canvas.itemconfigure(monitem, fill='black')
        else:
            canvas.itemconfigure(monitem, fill='white')

    "Dessine la grille"
    taille_case=20
    canvas Canvas(fen, widthx*taille_case+4, height=y*taille_case+4)

    i = 0
    while i < x:
        j = 0
        while j < y:
            canvas.create_rectangle((i*taille_case)+2,(j*taille_case)+2,((i+1)*taille_case)+2 , ((j+1)*taille_case)+2, fill='white')
            j+=1
        i+=1

    canvas.pack()
    canvas.bind('', onClick)
#-------------------------------------------------------------------------------
def Apercu(fen,x,y):
    "Dessine l'aperçu"
    taille_case=5
    canvas Canvas(fen, widthx*taille_case+4, height=y*taille_case+4)

    i = 0
    while i < x:
        j = 0
        while j < y:
            canvas.create_rectangle((i*taille_case)+2,(j*taille_case)+2,((i+1)*taille_case)+2 , ((j+1)*taille_case)+2, outline='white',fill='white')
            j+=1
        i+=1

    canvas.pack()
#-------------------------------------------------------------------------------
root = Tk()
Apercu(root,25,25)
Grille(root,25,25)
root.mainloop()
0
lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 73
18 mars 2010 à 11:14
Bonjour,

Ne connaissant pas ce jeu, je ne vois pas très bien la démarche pour le programmer.

Sil s'agit simplement de reporter les modifications de la grande grille dans la petite grille (aperçu), je propose le code suivant:
#-*- coding: utf-8 -*-
from Tkinter import *
#-------------------------------------------------------------------------------
def Grille(fen,x,y):
    def onClick(event):
        monitem = canvas.find_closest(canvas.canvasx(event.x), canvas.canvasy(event.y))
        print monitem
        if canvas.itemcget(monitem, 'fill') == 'white':
            canvas.itemconfigure(monitem, fill='black')
        else:
            canvas.itemconfigure(monitem, fill='white')

        if apercu.itemcget(monitem, 'fill') == 'white':
            apercu.itemconfigure(monitem, fill='black')
        else:
            apercu.itemconfigure(monitem, fill='white')

    "Dessine la grille"
    taille_case=20
    canvas Canvas(fen, widthx*taille_case+4, height=y*taille_case+4)

    i = 0
    while i < x:
        j = 0
        while j < y:
            canvas.create_rectangle((i*taille_case)+2,(j*taille_case)+2,((i+1)*taille_case)+2 , ((j+1)*taille_case)+2, fill='white')
            j+=1
        i+=1

    canvas.pack()
    canvas.bind('', onClick)
#-------------------------------------------------------------------------------
def Apercu(fen,x,y):
    "Dessine l'aperçu"
    taille_case=5
    apercu Canvas(fen, widthx*taille_case+4, height=y*taille_case+4)

    i = 0
    while i < x:
        j = 0
        while j < y:
            apercu.create_rectangle((i*taille_case)+2,(j*taille_case)+2,((i+1)*taille_case)+2 , ((j+1)*taille_case)+2, outline='white',fill='white')
            j+=1
        i+=1

    apercu.pack()
    return apercu
#-------------------------------------------------------------------------------
root = Tk()
apercu=Apercu(root,25,25)
Grille(root,25,25)
root.mainloop()

0