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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 741
    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 741
    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 741
    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 741
    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

+ 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