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 :

Perdue dans le train [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Perdue dans le train
    Bonjour

    Me revoilà....encore perdue dans tkinter.
    Le script :
    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
     
    from tkinter import*
     
    def cercle(can,x,y,r,coul) :
        "dessin d'un cercle de rayon r en (x,y) dans le canevas can"
        can.create_oval(x-r,y-r,x+r,y+r,fill=coul)
     
    class Application(Tk) :
        def __init__(self) :
            Tk.__init__(self)    # constructeur de la classe parente
            self.can = Canvas(self,width=475,height=130,bg='white')
            self.can.pack(side=TOP,padx=5,pady=5)
            Button(self,text="Train",command=self.dessine).pack(side=LEFT)
            Button(self,text='Hello',command=self.coucou).pack(side=LEFT)
            Button(self,text="Allumer",command=self.lumiere).pack(side=LEFT)
     
        def dessine(self) :
            "instanciation de 4 wagons dans le canevas"
            self.w1 = Wagon(self.can,10,30,'light salmon')
            self.w2 = Wagon(self.can,130,30,'SlateBlue1')
            self.w3 = Wagon(self.can,250,30,'pale green')
            self.w4 = Wagon(self.can,370,30,'DarkGoldenrod3')
     
        def coucou(self) :
            "apparition de personnages dans certaines fenêtres"
            self.w1.perso(3)     # 1er wagon, 3ème fenêtre
            self.w3.perso(1)     # 3ème wagon, 1ère fenêtre
            self.w3.perso(2)     # 3ème wagon, 2ème fenêtre
            self.w4.perso(1)     # 4ème wagon, 1ère fenêtre
     
        def lumiere(self) :
            "lumière !"
            self.w1.allumer()
            self.w3.allumer()
            self.w4.allumer()
     
     
    class Wagon(object) :
        def __init__(self,canev,x,y,couleur) :
            "dessin d'un petit wagon en (x,y) dans le canevas 'canev'"
            # mémorisation des paramètres dans des variables d'instance :
            self.canev,self.x,self.y,self.couleur = canev,x,y,couleur
            # rectangle de base : 95 x 60 pixels :
            canev.create_rectangle(x,y,x+95,y+60,fill = couleur)
            # 3 fenêtres de 25x40 pixels, écartées de 5 pixels :
            self.fen = []
            for xf in range(x+5,x+90,30) :
                self.fen.append(canev.create_rectangle(xf,y+5,xf+25,y+40,fill='black'))
            cercle(canev,x+18,y+73,12,"grey56")
            cercle(canev,x+77,y+73,12,"grey56")
     
        def perso(self,fen) :
            "apparition d'un petit personnage à la fenêtre 'fen'"
            # calcul des coordonnées du centre de chaque fenêtre :
            xf = self.x + fen*30 - 12
            yf = self.y + 25
            cercle(self.canev,xf,yf,10,'pink')    # visage
            cercle(self.canev,xf-5,yf-3,2,'black')  # oeil gauche
            cercle(self.canev,xf+5,yf-3,2,'black')  # oeil droit
            cercle(self.canev,xf,yf+5,3,'red')    # bouche
     
        def allumer(self) :
            """permet d'allumer la lumière dans les wagons, en teintant les fenêtres
    en jaune"""
            for fen in self.fen :
                self.canev.itemconfigure(fen,fill='yellow')
     
     
    app = Application()
    app.mainloop()
    J'ai donc ce code (qui n'est pas de moi, fourni par l'auteur de l'exercice), et je dois le modifier pour qu'on puisse cliquer sur les boutons "Allumer" et "Hello" sans provoquer d'erreur.
    Je suis à peu près certaine que c'est pas très compliqué, et même probablement à ma portée dans l'absolu, mais je ne suis pas sûre de bien comprendre le code fourni.
    De toute façon, le simple fait d'être dans tkinter paralyse mes neurones.
    Donc je ne sais pas comment m'y prendre.
    Est-ce qu'il est possible de mettre une condition à la commande d'un bouton ? Par exemple si tant que le bouton "train" n'a pas été activé, les boutons "Allumer" et "Hello" resteront en grisés, et ne fonctionneraient pas.
    Si oui comment on fait une telle chose ?


    Désolée pour le roman. Et mon niveau

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    Par exemple si tant que le bouton "train" n'a pas été activé, les boutons "Allumer" et "Hello" resteront en grisés, et ne fonctionneraient pas.
    Si oui comment on fait une telle chose ?
    Il faut lire le code pour voir à quoi correspond "appuyer sur le Button train" i.e. à l'appel de la méthode dessine qui créer les "wagons" et doit être exécuté avant l'appui sur les autres Buttons qui modifient ces "wagons" (et supposent qu'ils aient déjà été créés).
    Dit autrement, tant qu'on n'est pas passé par "dessine", l'appel des autres fonctions/méthodes plantera.

    Une méthode simple pour tester que "dessine" a été appelé est de créer une variable/attribut self.wagons_exists initialisée à False, positionnée à True par dessine et testé dans les autres fonctions.

    Vous pouvez aussi changer l'état des Buttons: ils sont initialisés dans l'état disabled et passés à "normal" par dessine.
    C'est la même logique un truc modifié par le passage dans "dessine"

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

  3. #3
    Membre émérite

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    Mars 2002
    Messages
    649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Billets dans le blog
    1
    Par défaut
    le simple fait d'être dans tkinter paralyse mes neurones
    Pourquoi ne pas s’entraîner sur des cas plus simples !
    Exemple
    dessiner un rectangle
    Dessiner un rectangle avec un carré dedans
    Changer la couleur du carré en cliquant sur un bouton
    ...
    et finalement reconstruire tout l'exercice
    Pour moi, c'est beaucoup plus efficace que prendre un code tout fait et de le modifier sans trop comprendre.
    Remarque : les boutons allumer et Hello fonctionnent chez moi ... bizarrreu

  4. #4
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Citation Envoyé par Michel Voir le message
    les boutons allumer et Hello fonctionnent chez moi ... bizarrreu
    Euh non c'est normal
    Par contre, ils fonctionnent uniquement si on a d'abord cliqué sur train.
    Si tu ne cliques pas sur train, mais seulement sur allumer et hello, il y a un message d'erreur. Forcément puisqu'on essaie de modifier un dessin....qui n'est pas dessiné Ahah

    En effet, je devrai m'entraîner sur des trucs simples. Beaucoup. Longtemps. Jusqu'à ce que je finisse par me représenter ce que le code dessine, au moins un peu.


    @ wiztricks : merci pour ces pistes je commence par entrevoir....non pas encore la lumière....mais par où elle pourrait passer

  5. #5
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Yes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def lumiere(self) :
            "lumière !"
            try :
                if self.wagons_exists == True :            
                    self.w1.allumer()
                    self.w3.allumer()
                    self.w4.allumer()
            except :
                pass
    et idem pour la méthode coucou

    Voilà. Et c'est impeccable, plus de message d'erreur bien sûr, simplement ça ne fonctionne que si on a d'abord cliqué sur Train.
    Les personnages ont toujours l'air d'être pris en otage par un serial killer, mais ça c'est un autre problème, qui se passera de solution


    Encore merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Le try... except... n'a rien à faire là (pour autant que l'attribut wagons_exists soit géré correctement, sinon il ne sert à rien).

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

  7. #7
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Pourtant, ça fonctionne.

    Vous pensiez à un interrupteur avec self.wagons_exists c'est ça ?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    Pourtant, ça fonctionne.
    Une construction comme try...except... est faite pour gérer des exceptions.
    Une exception est quelque chose qui peut arriver de façon imprévue.
    Ici vous savez (via wagons_exists) si on est passé par "dessine" ou pas.

    Alors oui try...except fonctionne puisqu'il masque l'erreur mais, dans ce cas, wagons_exists ne sert plus à rien et c'est pas la peine d'apprendre à coder si c'est pour écrire des horreurs pareilles et vous en contenter parce que "çà fonctionne".

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

  9. #9
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    J'avoue, je savais en le faisant que je contournais le problème.
    Après avoir essayé 15 trucs inutiles et qui ne fonctionnaient pas, j'ai tenté le truc tout simple et parfaitement logique...qui fonctionne :


    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
    def __init__(self) :
            Tk.__init__(self)    # constructeur de la classe parente
            self.can = Canvas(self,width=475,height=130,bg='white')
            self.can.pack(side=TOP,padx=5,pady=5)
            Button(self,text="Train",command=self.dessine).pack(side=LEFT)
            Button(self,text='Hello',command=self.coucou).pack(side=LEFT)
            Button(self,text="Allumer",command=self.lumiere).pack(side=LEFT)
            self.wagons_exists = False
    
        def dessine(self) :
            "instanciation de 4 wagons dans le canevas"
            self.w1 = Wagon(self.can,10,30,'light salmon')
            self.w2 = Wagon(self.can,130,30,'SlateBlue1')
            self.w3 = Wagon(self.can,250,30,'pale green')
            self.w4 = Wagon(self.can,370,30,'DarkGoldenrod3')
            self.wagons_exists = True
            
            
    
        def coucou(self) :
            "apparition de personnages dans certaines fenêtres"
            if self.wagons_exists == True :                
                self.w1.perso(3)     # 1er wagon, 3ème fenêtre
                self.w3.perso(1)     # 3ème wagon, 1ère fenêtre
                self.w3.perso(2)     # 3ème wagon, 2ème fenêtre
                self.w4.perso(1)     # 4ème wagon, 1ère fenêtre
    
           
     
        def lumiere(self) :
            "lumière !"
            if self.wagons_exists == True :            
                self.w1.allumer()
                self.w3.allumer()
                self.w4.allumer()

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    Après avoir essayé 15 trucs inutiles et qui ne fonctionnaient pas, j'ai tenté le truc tout simple et parfaitement logique...
    Vous voyez bien que c'est les neurones qui ne connectent pas.

    Entraînez les en virant wagons_exists et en jouant avec l'état des Button: ils sont crées avec (...state=DISABLED) et dessine change leur état à NORMAL.

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

  11. #11
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Ah oui j'aurai bien aimé faire ça. Faire des boutons en grisés.
    Je vais essayer de faire ça demain, si j'ai pas le temps ce week-end au pire je m'y mets lundi matin.
    Parce que vraiment j'aimerai bien savoir faire ça

  12. #12
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Ah ah griser les boutons c'était facile

    les dé-griser par contre, c'est une autre paire de manches

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    les dé-griser par contre, c'est une autre paire de manches
    Si dessine doit modifier les Button, il faut pouvoir y accéder... et les avoir assigné à... lors de leur création.

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

  14. #14
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Rooooo dans la fonction dessine tout simplement.
    Depuis 1 heure j'essayais de créer une fonction change_bouton, sans réussir à définir ma condition


    bref, donc là, d'un seul coup....la lumière fut :
    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
     def __init__(self) :
            Tk.__init__(self)    # constructeur de la classe parente
            self.can = Canvas(self,width=475,height=130,bg='white')
            self.can.pack(side=TOP,padx=5,pady=5)
            self.bou_train = Button(self,text="Train",command=self.dessine)
            self.bou_train.pack(side=LEFT)
            self.bou_hello = Button(self,text='Hello',state='disabled',command=self.coucou)
            self.bou_hello.pack(side=LEFT)
            self.bou_allumer = Button(self,text="Allumer",state='disabled',command=self.lumiere)
            self.bou_allumer.pack(side=LEFT)
            Button(self,text='Quitter',command=self.quit).pack(side=RIGHT)
     
     
        def dessine(self) :
            "instanciation de 4 wagons dans le canevas"
            self.w1 = Wagon(self.can,10,30,'light salmon')
            self.w2 = Wagon(self.can,130,30,'SlateBlue1')
            self.w3 = Wagon(self.can,250,30,'pale green')
            self.w4 = Wagon(self.can,370,30,'DarkGoldenrod3')
     
            self.bou_hello.configure(state='normal')
            self.bou_allumer.configure(state='normal')
    Je ne sais pas si c'est très beau, mais cette fois j'espère que ce n'est pas une horreur

    Edit : du coup je peux aller virer la variable créer sur le bouton "train" c'est déjà ça de moins.
    Et j'ai mis un bouton quitter, parce que j'aime pas les fenêtre qui n'en ont pas.
    Et tout à l'heure je chercherai à faire des bouches qui ne crient pas "au secours".


    Edit2 : merci beaucoup Wiztricks

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Perdu dans mon tri...
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 10/10/2005, 21h38
  2. Réponses: 2
    Dernier message: 17/09/2005, 17h43
  3. Perdu dans tous ces framework, mvc, et template
    Par __fabrice dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 02/09/2005, 12h00
  4. Perdu dans le traitement de string
    Par MatMeuh dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/09/2004, 11h34
  5. Perdue dans les Response.Write...
    Par Tapioca dans le forum ASP
    Réponses: 4
    Dernier message: 11/07/2004, 11h54

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