IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Projet : Sud-O-Cul


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut Projet : Sud-O-Cul
    Bonjour, j'essaye de réaliser un sudoku mais je bloque, j'ai créer une fenêtre, et j'ai dessiné des lignes verticalement et horizontalement, 9 cases par lignes et colonnes.

    Mon problème est, comment faire pour rentrer des chiffres à l'intérieur de ces cases ? Faut-il trouver la position de chaque case ?

    Et savez vous comment faire pour sauter des lignes dans messagebox.showinfo ? J'ai chercher mais je trouve pas, normalement, on utilise \n mais ça ne marche pas du tout.

    Merci de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    from tkinter import*
    from tkinter import messagebox
    import tkinter as Tk
     
     
    sudoku = Tk.Tk()
    sudoku.title(" Sudoku ")
     
     
     
     
    def About () : messagebox.showinfo (title="A propos", message = "Version 1.0")
    def Comment_jouer () : messagebox.showinfo ("Comment jouer ?", "Le but du jeu est de remplir ces cases avec des chiffres allant de 1 à 9 en veillant toujours à ce qu'un même chiffre ne figure qu'une seule fois par colonne, une seule fois par ligne, et une seule fois par carré de neuf cases.")     
     
     
     
    mainmenu = Tk.Menu(sudoku)
    menu_partie = Tk.Menu(mainmenu)
    menu_partie.add_command(label="Quitter le jeu", command=sudoku.destroy)
     
    menu_help = Tk.Menu(mainmenu)
    menu_help.add_command(label="Comment jouer", command= Comment_jouer)
    menu_help.add_command(label=" A propos", command = About)
     
    mainmenu.add_cascade (label= "Partie", menu=menu_partie)
    mainmenu.add_cascade(label= "Aide", menu=menu_help)
     
     
    sudoku.config(menu=mainmenu)
     
     
    surface_dessin = Canvas(sudoku, width=480, height=480, bg='SaddleBrown', bd = 55, relief="ridge")
    surface_dessin.pack()
     
     
    scale = 480/9;
     
    for i in range(0, 10):
        if (i!=4) and (i!=7) :
            surface_dessin.create_line(i*scale, 0, i*scale, 580, width =1);
        else :
            surface_dessin.create_line(i*scale, 0, i*scale, 580, width =3);
     
     
     
    for j in range (0, 10) :
        if (j!=4) and (j!=7) :
            surface_dessin.create_line (0, j*scale, 580, j*scale, width = 1) ;
        else :
            surface_dessin.create_line (0, j*scale, 580, j*scale, width = 3) ;
     
     
     
     
     
     
     
     
     
     
     
     
    sudoku.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    Vous avez tout ce qu'il faut dans ce post
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Un peu trop kuku le titre...

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Bonsoir, merci beaucoup pour le lien. Il m'a été un chouïa utile, difficile de bien comprendre le codage.

    J'ai essayé de comprendre son code pour l'ajout de chiffre mais je ne comprends comment il a fait, quelqu'un peut m'expliquer ?

    Ou bien avez vous une autre solution pour cliquer à un endroit et y rentrer un chiffre au centre de la case sachant que ce n'est pas vraiment une case ?

    Je ne sais pas si vous allez me comprendre

    Merci encore de votre aide.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    C'est pas si compliqué!

    A la construction d'une instance de SudokuGrid, il y a un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.bind('<KeyPress>', self.on_keyPress)
    le callback sera appelé à chaque Key Press.
    Ca déroule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def on_keyPress(self, event):
            value = event.keysym if event.keysym in '123456789' else ''
            iid = self.find_withtag('current')[0]
            if iid in self._items:
                self._items[iid].set_value(value)
    En français, on récupère le caractère tapé (.keysym)
    S'il est dans 1..9 on positionne "value" à sa valeur sinon value devient ''.
    ".find_withtag('current')[0]" permet de récupérer l'identifiant de l'objet 'current'.
    Puis on cherche à quelle Cell il correspond via la map "._items".
    Si on trouve un Cell, on délègue le reste du boulot à la méthode .set_value

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        def set_value(self, value, initial=False):
            itemconfig = self.canvas.itemconfigure
            s = str(value) if value else ''
            itemconfig(self._label, text=s)
            self.value = value
            if initial:
                self.disable()
                self._is_initial = True
    Le paramètre value pouvant être "int" ou "str", null ou vide on le convertit en "str" dans s. self._label contient l'item Text à mettre à jour: un coup d'itemconfigure et puis voilà.

    Ce code ne fait "qu'afficher" et gérer des événements de "base".
    Côté permettre à un utilisateur de "jouer" une grille, il sait charger la grille initiale mais il ne s'occupe pas du tout de valider les nombres entrés: le dialogue avec l'utilisateur et la gestion de l'état du jeu sont "à faire".

    s/classer ou modifier le code existant sera probablement nécessaire selon "l'user expérience" que vous voudrez réaliser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Je te remercie pour ton aide !

    Si ça te dérange pas, tu pourrais me dire quel est la fonction que tu utilises ? Parce que je me vois pas sortir ce code du jour au lendemain et puis, à vrai dire, j'y comprends pas grand chose, je suis qu'un débutant hein, pas amateur

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    De quelle fonction parles-tu?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Je ne sais pas si c'est une fonction mais quand t'utilises self.bind. Même ceux avec les self.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Reprenez votre code initial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    surface_dessin = Canvas(sudoku, width=480, height=480, bg='SaddleBrown', bd = 55, relief="ridge")
    surface_dessin.pack()
     
    scale = 480/9;
     
    for i in range(0, 10):
        if (i!=4) and (i!=7) :
            surface_dessin.create_line(i*scale, 0, i*scale, 580, width =1);
        else :
            surface_dessin.create_line(i*scale, 0, i*scale, 580, width =3);
    surface_dessin est une variable globale contenant une instance de "Canvas".

    surface_dessin.create_line appelle la méthode .create_line de ce "canvas".
    .bind est autre une méthode du Canvas tk (comme .create_line)
    Plutôt que d'écrire çà dans le script "principal", on pourrait pousser/cacher ce code dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def create_lines(canvas):
        scale = 480/9
        for i in range(0, 10):
            if (i!=4) and (i!=7) :
            canvas.create_line(i*scale, 0, i*scale, 580, width =1);
        else :
            canvas.create_line(i*scale, 0, i*scale, 580, width =3);
    Pour l'exécuter, ce sera: create_lines(surface_dessin)

    Mais on peut, aussi dire, que le sudoku se joue sur un Grid, sous/classe de Canvas et des méthodes particulières dedans.
    C'est juste réorganiser le code qui précède en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Grid(tk.Canvas):
        create_lines = create_lines
    Pour l'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    surface_dessin = Grid(sudoku, width=480, height=480, bg='SaddleBrown', bd = 55, relief="ridge")
    surface_dessin.pack()
    surface_dessin.create_lines()
    A la syntaxe prêt, "create_lines" fonction et ".create_lines" méthode déroulent in fine le même code. C'est ce que souligne le "create_lines = create_lines".

    Si on déclare le "corps" de la fonction dans la déclaration de la classe, la convention est de nommer, "self" la variable qui représente le "canvas" (et premier paramètre de la fonction qui prend alors le nom de "méthode" qui s'applique alors à une classe).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Je suis un peu perdu

    Si j'ai bien compris, vous avez réorganiser mon code, c'est bien ça ?
    Je ne comprends pas pourquoi vous mettez le code pour créer les lignes dans une fonction puisqu'on l'invoque qu'une seule fois non ?

    J'ai essayé ce que vous m'avez dit mais il y a un soucis, ou peut-être que c'est moi le problème, pouvez vous vérifier ? Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    from tkinter import*
    from tkinter import messagebox
    import tkinter as Tk
     
     
     
    sudoku = Tk.Tk()
    sudoku.title(" Sudoku ")
     
     
     
     
    def About () : messagebox.showinfo (title="A propos",)
    def Comment_jouer () : messagebox.showinfo ("Comment jouer ?", "Le but du jeu est de remplir ces cases avec des chiffres allant de 1 à 9 en veillant toujours à ce qu'un même chiffre ne figure qu'une seule fois par colonne, une seule fois par ligne, et une seule fois par carré de neuf cases.")     
     
    def create_lines(canvas):
        scale = 480/9
        for i in range(0, 10):
            if (i!=4) and (i!=7) :
                canvas.create_line(i*scale, 0, i*scale, 580, width =1);
        else :
            canvas.create_line(i*scale, 0, i*scale, 580, width =3);
     
    def create_lines (canvas) :
        scale = 480/9
        for j in range (0, 10) :
            if (j!=4) and (j!=7) :
                canvas.dessin.create_line (0, j*scale, 580, j*scale, width = 1) ;
        else :
            canvas.dessin.create_line (0, j*scale, 580, j*scale, width = 3) ;
     
    mainmenu = Tk.Menu(sudoku)
    menu_partie = Tk.Menu(mainmenu)
    menu_partie.add_command(label="Quitter le jeu", command=sudoku.destroy)
     
    menu_help = Tk.Menu(mainmenu)
    menu_help.add_command(label="Comment jouer", command= Comment_jouer)
    menu_help.add_command(label=" A propos", command = About)
     
    mainmenu.add_cascade (label= "Partie", menu=menu_partie)
    mainmenu.add_cascade(label= "Aide", menu=menu_help)
     
     
    sudoku.config(menu=mainmenu)
     
     
     
     
    class Grid(tk.Canvas):
        create_lines = create_lines
     
     
    surface_dessin = Grid(sudoku, width=480, height=480, bg='SaddleBrown', bd = 55, relief="ridge")
    surface_dessin.pack()
    surface_dessin.create_lines()
     
     
     
     
     
     
    sudoku.mainloop()

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Je ne comprends pas pourquoi vous mettez le code pour créer les lignes dans une fonction puisqu'on l'invoque qu'une seule fois non ?
    Pour découper la longue séquence d'opérations qui construit l'interface en étapes logiques. Ca aide à structurer le programme en leur donnant un nom particulier, limiter la dépendance avec des variables globales,...

    Dans l'exemple ci dessous, j'ai crée une fonction "create_menu" pour regrouper les créations de menu et j'ai déplacé le reste sous "if __name__ == '__main__':".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    from tkinter import messagebox
    import tkinter as tk
     
    def About () : messagebox.showinfo (title="A propos",)
    def Comment_jouer () : messagebox.showinfo ("Comment jouer ?", "Le but du jeu est de remplir ces cases avec des chiffres allant de 1 à 9 en veillant toujours à ce qu'un même chiffre ne figure qu'une seule fois par colonne, une seule fois par ligne, et une seule fois par carré de neuf cases.")     
     
    def create_lines(canvas):
        scale = 480/9
        for i in range(0, 10):
            if (i!=4) and (i!=7) :
                canvas.create_line(i*scale, 0, i*scale, 580, width =1);
        else :
            canvas.create_line(i*scale, 0, i*scale, 580, width =3);
     
    def create_menu(app):
     
        menu = tk.Menu(app)
     
        m = tk.Menu(menu)
        m.add_command(label="Quitter le jeu", command=app.destroy)
        menu.add_cascade (label= "Partie", menu=m)
     
        menu.add_command(label="Comment jouer", command= Comment_jouer)
        menu.add_command(label=" A propos", command = About)
     
        app['menu'] = menu
     
    if __name__ == '__main__':
        app = tk.Tk()
        app.title(" Sudoku ")
     
        create_menu(app)
        grid = tk.Canvas(app, width=480, height=480, bg='SaddleBrown', bd = 55, relief="ridge")
        grid.pack()
        create_lines(grid)
     
        app.mainloop()
    "Rangé ainsi", est-ce que ce code n'est pas un peu plus lisible?
    Vous êtes intéressé au premier chef par la lisibilité du code que vous mettez au point: à vous de voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    En effet, c'est beaucoup plus organiser. Je ne comprends pas le "if __name__ == '__main__':" ; vous avez dit que vous avez déplacé le reste, je ne vois pas quel reste, j'ai comparé le mien et le vôtre, et je ne comprends pas, pouvez vous m'éclaircir ?


    Ensuite, pour le clique de la souris, il faut l'ajouter comme tel dans mon code ?
    J'ai essayé le code mais je n'arrive toujours pas à rentrer des chiffres dans les cases, faut-il que j'utilise le widget entry ?

    Merci de votre patience !

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si votre ambition est de faire un jeu de sudoko avec une interface graphique construite avec tkinter, il faudra écrire quelques centaines de lignes de code.

    Si vous décider de passer par le widget Canvas pour afficher la grille et "interagir" avec l'utilisateur, il va falloir prendre le temps de regarder comment fonctionne ce widget Tk. Ca passe par la réalisation de bouts de code qui:
    • dessinent les carreaux,
    • affiche la grille initiale,
    • savoir comment l'utilisateur pourra définir dans quelle case devra être affiché le chiffre tapé.

    Pour l'instant, vous savez dessiner des carreaux. C'est bien.

    Comment afficher la grille initiale? Avec un canvas difficile de ne pas utiliser .create_text. Comment savoir quelle case l'utilisateur veut jouer?
    Dans mon code, une case est créé par .create_rectangle et son bord devient rouge lorsque la souris est positionné dessus. S'il tape un chiffre l'item text associé à la case est mis à jour.

    Vous voulez réaliser cela autrement, très bien!
    Essayez de le coder, si vous rencontrez des difficultés, montrez comment vous avez essayé de... tous ceux qui lisent ce forum pourront essayez de vous aider.
    Mais lire la documentation Tk, définir les widgets à utiliser, les secouer un peu pour comprendre ce qu'ils font,... sont des activités que personne ne fera à votre place (c'est comme pour aller pisser).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Désolé pour ma réponse tardive.

    Je vais essayer de coder sa, je reviendrais plus tard.

    Quand vous dîtes afficher la grille initiale, je ne comprends pas, c'est à dire ? Faire en sorte que python considère ce qu'on a tracé en tant que grille ?

    Vous me conseillez donc d'aller consulter la partie sur .create_text pour afficher la grille initial ?

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Pytdeb Voir le message
    Vous me conseillez donc d'aller consulter la partie sur .create_text pour afficher la grille initial ?
    Comment envisagiez vous d'afficher un nombre dans la grille que vous avez dessiné dans le Canvas? Si vous avez mieux que .create_text, pourquoi pas mais je demande à voir!

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    je suis bloqué, j'essaye d'utiliser create_text mais je ne sais pas quoi faire. Pour la position, je ne vois pas quoi mettre. J'ai commencé avec :

    def create_text (canvas):
    app.create_text( )

    Faudrait-il que je définisse ce qu'est une case ? Pouvez vous m'indiquer le chemin à suivre ? Je commence à devenir fou

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    .create_text est une méthode du Canvas Tk (comme .create_rectangle).
    Pour la position, il y a 9x9=81 cases dans la grille.
    La position du "text" dans la case (r, c) pourrait être son centre.
    (r, c) étant le numéro de row, column

    Après c'est des règles de trois: quelles sont largeur et hauteur (width, height) du Canvas? Divisé par 9 çà donne la largeur x hauteur d'une case. A partir de là, on peut calculer la position du coin de la case (r, c), son centre.

    Faudrait-il que je définisse ce qu'est une case ? Pouvez vous m'indiquer le chemin à suivre ? Je commence à devenir fou
    La "case" est un objet élémentaire du jeu de Sudoku: elle aura une ligne, une colonne et sera dans une zone 3x3: elle devra avoir une valeur dans 1..9 différentes de celles qui sont même ligne, même colonne, même zone.
    Elle sera remplie initialement ou devra l'être par le joueur (comment le joueur pourra désigner la case qu'il souhaite "jouer"?).

    La notion de case est bien définie.
    Coder c'est décider comment seront représentées les différentes propriétés de la "case". Afficher la valeur quelle contient au bon endroit de votre grille, est un aspect de ce "comment"...

    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Voilà, j'ai essayé sa mais je ne sais pas comment faire pour rendre sélectionnable la case.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    from tkinter import messagebox
    import tkinter as tk
     
    def About () : messagebox.showinfo (title="A propos",)
    def Comment_jouer () : messagebox.showinfo ("Comment jouer ?", "Le but du jeu est de remplir ces cases avec des chiffres allant de 1 à 9 en veillant toujours à ce qu'un même chiffre ne figure qu'une seule fois par colonne, une seule fois par ligne, et une seule fois par carré de neuf cases.")     
     
    def create_lines_vert(canvas):
        scale = 480/9
        for i in range(0, 10):
            if (i!=4) and (i!=7) :
                canvas.create_line(i*scale, 0, i*scale, 580, width =1);
            else :
                canvas.create_line(i*scale, 0, i*scale, 580, width =3);
     
    def create_lines_hor (canvas) :
        scale = 480/9
        for j in range (0, 10) :
            if (j!=4) and (j!=7) :
                canvas.create_line(0, j*scale, 580, j*scale, width = 1);
            else :
                canvas.create_line (0, j*scale, 580, j*scale, width = 3) ;
     
    def create_menu(app):
     
        menu = tk.Menu(app)
     
        m = tk.Menu(menu)
        m.add_command(label="Quitter le jeu", command=app.destroy)
        menu.add_cascade (label= "Partie", menu=m)
     
        menu.add_command(label="Comment jouer", command= Comment_jouer)
        menu.add_command(label=" A propos", command = About)
     
        app['menu'] = menu
     
     
        l_case = 450/9
        h_case = 450/9
     
    def click( self, event ):
          self.clickPosition( event.x, event.y )
     
          l_case = 450/9
          h_case = 450/9
     
          case_x= (event.x) / l_case
          case_y= (event.y) / h_case
     
     
          centre_case_x= (case_x - 1) * l_case + l_case /2;
          centre_case_y= (case_y -1) * h_case +h_case /2;
     
          if (case_x==0) :
              centre_case_x = l_case /2
          else :
              centre_case_x = (case_x-1)*l_case + l_case/2;
     
          if (case_y==0) :
              centre_case_y = h_case /2
          else :
              centre_case_y = (case_y -1) * h_case + h_case /2 ;
     
    def ecrire (event) :
            grid.create_text ( click, fill=text_color, text='', font=canvas.font )
     
    if __name__ == '__main__':
        app = tk.Tk()
        app.title(" Sudoku ")
     
        create_menu(app)
        grid = tk.Canvas(app, width=450, height=450, bg='SaddleBrown', bd = 55, relief="ridge")
        grid.pack()
        create_lines_vert(grid)
        create_lines_hor (grid)
     
     
        app.mainloop()

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 1
    Points
    1
    Par défaut
    Bonsoir, je reste bloqué dans mon code, pouvez vous m'aider ? Merci.
    Je ne sais pas si c'est bon, je ne vois pas de résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    def click( self, event ):
          self.clickPosition( event.x, event.y )
     
          l_case = 450/9
          h_case = 450/9
     
          case_x= (event.x) / l_case
          case_y= (event.y) / h_case
     
     
          centre_case_x= (case_x - 1) * l_case + l_case /2;
          centre_case_y= (case_y -1) * h_case +h_case /2;
     
          if (case_x==0) :
              centre_case_x = l_case /2
          else :
              centre_case_x = (case_x-1)*l_case + l_case/2;
     
          if (case_y==0) :
              centre_case_y = h_case /2
          else :
              centre_case_y = (case_y -1) * h_case + h_case /2 ;
     
    def ecrire (event) :
            grid.create_text ( click, fill=text_color, text='', font=canvas.font )

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Si vous ne filez pas tout le code, pas possible de testez.
    Regardez la discussion, vous n'êtes pas le seul à coder du sudoku.
    En plus votre collègue a de bonnes idées: essayez d'en profiter.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Microsoft étend son projet 4Afrika à l'Afrique du Sud
    Par Stéphane le calme dans le forum Actualités
    Réponses: 1
    Dernier message: 02/08/2013, 11h02
  2. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 14h52
  3. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 17h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo