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

Tkinter Python Discussion :

Jeu le mot le plus long avec Tkinter


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut Jeu le mot le plus long avec Tkinter
    Bonjour à tous!

    J'ai envie de créer le jeu 'le mot le plus long' sous forme de Tkinter.

    J'ai déjà crée les programmes (afficher un choix aléatoire de lettre, afficher des consonnes et des voyelles, mode de saisie manuelle...). Tous ces programmes fonctionnent séparément mais pas quand je les mets ensemble!
    Je ne comprend pas pourquoi!

    Je vous mets en pièce jointe le graphique du mode adulte que je voudrais faire et les trois programmes qui fonctionnent séparément ainsi que le programme final, c'est à dire celui où il sont tous liés.

    Pouvez-vous m'aider?

    Cdt,
    Calaca
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour,

    Dans un programme normal, il n'y a qu'une seule instance d'IHM.

    Dans ton cas, chaque programme possède sa propre instance ihm, ce qui au final fait que independemment, chaque programme fonctionne bien, mais il te sera impossible de les assembler.

    Il faut, pour faire ce que tu désires faire, mettre tes different code sous forme de module (deja fait) ne contenant que des fonctions/procedures et/ou classe. Cela veut dire que tu conserve tes modules déjà créés, et tu en créé un ne concernant que l'IHM.

    Enfin, tu créé un module effectuant la liaison entre tous les modules précédent, le module père.

    Pour reprendre ton exemple:
    Module Jeu
    --->import module IHM
    --->import module choix des lettres
    --->import module affichage des lettres
    --->import module saisie des lettres adultes
    --->import module ...

    Le but est qu'au final, chaque module est indépendant, et tu peux ainsi les faire évoluer aisément, sans affecter les modules annexes. Cela entraîne une maintenabilité améliorée

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut Le mot le plus long
    Bonjour,
    je tiens tout d'abord à vous remercier pour votre réponse.
    Cependant étant novice en python et donc en tkinter, serait-il possible d'avoir de plus amples informations sur votre réponse afin de la mettre à profit?
    Je vous remercie d'avance

  4. #4
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonsoir,

    Cela ne concerne pas specialement TKInter, mais tous les programmes en general. Il s'agit d'une structure dite modulaire. Chaque module est independant (possibiliter de le lancer de manière autonome), mais peut également etre appelé de l'extérieur.

    Pour réaliser cela, on utilise dans chaque module le fameux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if __name__ == "__main__":
    qui permet de déterminer si on lance le module directement ou non. Dans le premier cas, __name__ vaudra __main__, et le code sera exécuté. Dans le second cas, __name__ sera différent de __main__ et le code du block if ne sera pas exécuté.

    Dans ton cas, ou tu semble désiré utiliser une ihm pour tester chaque module, je t'invite à coder tous en classe et fonctions/procedure, puis à gérer l'ensemble dans ce if. Ainsi quand tu lanceras le module en direct, tu pourra appeler ta classe interne ihm, mais si tu importe le module ailleurs, il ne sera pas utilisé.

    Par exemple:
    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
    #shebang
    class MesFonctions():
        def fct1():
            ...
     
        def fct2():
            ...
     
    class MonIhm():
        ....
     
    if __name__ == "__main__":
       ihm = MonIhm()
       fct = MesFonctions()
       ...
       ihm.start_ihm()
    Cela est un exemple rapide. Tu peut regarder de plus près un projet concret simple comme Pycalcar, un de mes premiers logiciels, ou encore pyxmaker Ici.

    Je tacherais de repondre à tes autres questions qui resteront en suspens après que tu ai étudier un peu ces codes. Cela est très important, car c'est une méthodologie basique qu'il faut assimiler afin de coder correctement par la suite.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut
    Bonjour,
    je comprend ce que vous m'expliquez mais je n'arrive pas à le mettre en place...!
    Python ne détecte pas d'erreur sur ce que j'ai programmé mais rien ne se passe.
    Pouvez-vous me donner un exemple plus précis svp?

    Bonne journée,
    Calaca

  6. #6
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Bonjour

    Je vous propose ci-dessous un petit programme qui n'est pas aussi évolué que ce que propose deusyss ( beaucoup plus compétent que moi ) mais qui peut vous donner des pistes.

    Quand je mets activité 1 ce pourrait être par exemple tirer un nombre entre 1 et 10, activité 2 afficher une lettre au hasard dans l'alphabet.

    Ceci ne répond pas exactement à votre question mais peut vous donner des pistes.
    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
    #! /usr/bin/env PYTHON
    # -*- coding: utf-8 -*-
     
     
    from tkinter import *
     
     # ce programme explique comment avoir un menu global et passer d'une activité à une autre tout an gardant la même fenêtre.
     
     
    def nettoyage():
     
        for w in fen.winfo_children():
            w.destroy()
        fen.pack_propagate(0)#si tu veux que la fenetre ne se redimentionne pas
     
     
     
    def activite1():
     
        global nettoyer
        nettoyer=1
        nettoyage()
     
     
        # ici on mettrait les lignes de codes concernant cette activité 2
     
     
        bouton2= Button(fen, text="Fin de l'activité 1 \n \n Retour au menu", command=menu, bg="Lightgreen")
        bouton2.place(width=200,height=60,relx=0.4, rely=0.4) 
     
    def activite2():
        global nettoyer
        nettoyer=1
        nettoyage()
     
        # ici on mettrait les lignes de codes concernant cette activité 2
     
     
        bouton2= Button(fen, text= "Fin de l'activité 1 \n \n Retour au menu", command=menu, bg="lightgreen")
        bouton2.place(width=200,height=60,relx=0.4, rely=0.4) 
     
    def menu():
     
        if nettoyer==1:
            nettoyage()
     
     
        bouton1= Button(fen, text= "Lancement de l'activité 1", command=activite1 ,bg='red')
        # ci-dessous largeur, hauteur du bouton et sa positon en pourcentage de la largeur et de la hauteur de la fenêtre
        bouton1.place(width=200,height=30,relx=0.4, rely=0.3)
     
     
        bouton2= Button(fen, text= "Lancement de l'activite 2", command=activite2,bg='lightblue')
        bouton2.place(width=200,height=30,relx=0.4, rely=0.6) 
     
     
     
     
    fen= Tk()
    fen.title('Diverses Activités')
    fen.geometry("800x600")
    nettoyer=0
    menu()
     
     
    fen.mainloop()

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut
    Merci couragecourage pour votre réponse,
    Nous avons réutiliser votre idée pour tout le début du programme mais nous n'arrivons pas à lier des champs de saisies (StringVar()) afin de définir notre algorithme pour trouver le mot le plus long.
    Merci d'avance

  8. #8
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour,

    Afin de t'aider au mieu, pourrais tu nous communiquer tes nouveaux fichiers s'il te plait?

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut
    Finalement je vous envoie une dernière version. Ça à l'air de correspondre à ce que vous disiez (enfin je crois ) cependant je ne sais pas comment la faire fonctionner sur mon exemple
    (PS dans mon exemple e est le champs de saisie du tirage des lettres pour les fonctions saisissez_vos_lettres, consonnes/voyelles et saisie aléatoires)
    Fichiers attachés Fichiers attachés

  10. #10
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Je viens de lire ton code.

    Avant toute chose, j'aurais aimé savoir s'il s'agissait d'un seul fichier, ou de plusieurs mis bout à bout pour n'avoir à poster qu'un seul fichier. Il semble également manquer le fichier dico.txt dans ton post.

    Bref, au delà de ce que je viens de dire, je pense qu'il te manque un peu de methodologie pour coder "proprement". Aucun soucis, j'ai commencé moi aussi à une époque.

    Alors tout d'abord, il faut toujours commencer par le shebang (si tu est sous Linux) en ligne 1, puis sur la ligne 2, il faut écrire la ligne d'encodage. Ensuite, tu doit mettre les imports, puis tes classes, puis tes fonctions/procedure, puis ton if __name__.

    Je resume:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Shebang
    Encodage
     
    Import
     
    Classe(s)
    Fonction(s)/Procedure(s)
     
    if __name__
    Je te conseille de regarder du coté des PEP, qui expliquent comment organiser son code Ici.

    Côté if __name__, tu t'en sert bien comme il faut. Mefie toi aussi du readlines(). S'il est pratique, surtout dans ton cas, car il permet de lire le fichier d'un coup, il peut etre à double tranchant. EN effet, s'il y a trop de données à lire, la memoire sera surchargée.

    Essaie également de nommer les variables avec des noms plus explicites, cela t'aideras à t'y retrouver plus facilement. Si cela n'est pas trop gênant ici, attend d'avoir des fichier de code de 40 000 lignes vecu) sans saut de lignes, et tu te diras que c'était une super idée lol.

    J'attend ton retour sur mes questions du debut de post, mais tu es sur la bonne voie, continue comme ça

  11. #11
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut
    Ceci n'est qu'un seul fichier. Je t'envoie en lien le dico que je n'ai pas réussi à t'envoyer avant.
    Merci encore pour tout!

    https://www.mediafire.com/?bahggrassj6m7km

  12. #12
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Merci beaucoup, je regarde cela de près ce soir, et revient vers toi

  13. #13
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Comme promis, j'ai regardé de plus près. ton jeu ne fonctionne pas chez moi, non sans raison. As tu essayé de le lancer?

    N'étant pas là pour faire le code à ta place (ça c'est ton rôle, c'est comme ça qu'on apprend ), je te joints une structure simple pour ton jeu. Cela t'aidera à apprendre à coder au mieux.

    Tu y verras 5 fichiers:
    >Path_mkr.py: contient une fonctions qui t'indiquera toujours d'ou ton code est executé
    >fonctions.py: contient ta classe MesFonctions
    >jeu.py: contient ta classe Jeu
    >ihm.py: doit etre le seul fichier à contenir du code lié à TKinter
    >MotLePlusLong.py: importe tous les autres modules et sert de liens entre eux.

    Ainsi decoupé ton code est très aisément maintenable, et même par plusieurs dev à la fois (1dev/fichier par exemple).

    Pour chaque module, n'importe que les librairie nécessaire. Par exemple, hors du fichier ihm, n'importe pas le module Tkinter, sauf si tu t'en sert dans le if __name__ pour test.

    Pour les chemins, utilise toujours des chemins créé via "os.path.?". Cela t'évitera bien des ennuis à l'avenir.

    A lire ton code je pense que tu debute egalement en programmation objet, du moins, coté Python. Quand tu créé un objet à partir d'une classe, cela appelle une fonction de la classe, "__init__". Pour cette raison, tu trouveras (j'ai ajouté) des "def __init__():". A chaque creation d'objet, cette fonction est appelée. Tu peut y mettre du code pour initialiser des variables, appeler des fonctions ...

    Je te laisse travailler un peu sur ton code, et n'hesite pas à poser d'autre question.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Le mot le plus long
    Par bernedef dans le forum Langage
    Réponses: 12
    Dernier message: 25/05/2010, 13h27
  2. Rechercher mot le plus long d'une chaine de caractère
    Par fafabzh6 dans le forum VBA Access
    Réponses: 5
    Dernier message: 14/10/2009, 17h15
  3. [RegEx] Conserver le mot le plus long
    Par Zoldik dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2009, 12h14
  4. Affichage du mot le plus long
    Par winzilla dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 13/11/2008, 23h25
  5. Trouver le mot le plus long dans une chaîne
    Par bassoum dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 02/11/2008, 10h45

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