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 :

Modification d'une variable avec un bouton TKinter [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nicaragua

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 68
    Par défaut Modification d'une variable avec un bouton TKinter
    Bonjour

    Merci pour le temps que vous passez à lire les messages des débutants comme moi. :-)

    Je suis en train de commencer à apprendre à programmer en Python. Mon projet actuel est assez simple :
    créer une fenêtre qui va afficher des "cartes flashs" correspondant à des listes. Des boutons serviront pour passer à la carte précédente ou suivante. (Je suis professeur en école primaire et ça me servirait comme application d'apprentissage)

    J'ai commencé à utiliser les "class" (Ce qui me procura un grand plaisir quand ça fonctionna pour la première fois :-D )
    Cependant, je suis bloqué sur l'action des boutons.

    J'ai créé une fonction qui devrait être activée par une pression sur le bouton, mais rien ne se passe...
    • Ou la variable "i" n'évolue pas comme je l'imagine (elle ne bouge pas), mais je ne sais pas encore utiliser un débogueur pour observer ça...
    • Ou c'est la fenêtre qui ne se rafraîchit pas, et donc qui ne prend pas en compte l'évolution de ma variable "i".

    Je penche plus vers la seconde hypothèse, mais on ne sait jamais...

    Voici mon code. Pourriez-vous m'orienter ?

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    # Création d'une fenetre pour afficher les flash cards affichant une image et 4 informations
    # en utilisant les objets
    # Tutoriel sur les objets : https://www.youtube.com/watch?v=dfUM_9xibf8
    # Import de la bibliothèque TKinter
    from tkinter import *
     
    ########################
    #    Partie logique    #
    ########################
     
    # Création d'une "classe" contenant les information d'une "flash card"
    class FlashCard:
     
        def __init__(self, num, pers, act, obj):   # Constructeur de classe
            self.num = num          # Création d'un nouvel attribut qui se verra affecter la valeur de la variable
            self.pers = pers
            self.act = act
            self.obj = obj
            # self.img = img        # Pour plus tard
     
        def get_num(self):          # Création d'une méthode (fonction dans une classe) "Geter" ou "Assesseur" dans ce cas, pour récupérer une info
            return self.num
     
        def get_pers(self):
            return self.pers
     
        def get_obj(self):
            return self.obj
     
        def get_act(self):
            return self.act
     
        def incr_num(self):         # Création d'une méthode : un "Seter" ou "Mutateur" dans ce cas pour modifier une info
            self.num += 1
     
        def decr_num(self):
            self.num -= 1
     
     
    # Création de listes contenant les données à afficher
    liste_pers = ["Dompteur", "Adam", "Lucy", "Pythagore", "Français", "Mime"]
    liste_obj = ["Des anneaux pour sauter", "Une pomme", "Un gourdin", "Une équère", "Une baguette", "Des gants blancs"]
    liste_act = ["Dompter un fauve", "Manger une pomme", "Taper avec un gourdin", "Mesurer un angle", "Manger une baguette", "Mimer en silence"]
     
    # Variable permettant de choisir quelle carte sera affichée
    i = 0
     
     
    # Fonction permettant d'incrémenter le numéro de la carte à afficher
    def incr_i():
        global i
        i += 1
     
     
    # Instance de classe
    carte_i = FlashCard(i, liste_pers[i], liste_obj[i], liste_act[i])
     
    print("Cartes en mémoire : ")
     
    ##########################
    #    Partie affichage    #
    ##########################
     
    # Création d'une fenêtre TK
    root = Tk()
    # Définir la couleur de fond de la fenêtre
    root.configure(bg="white")
     
     
    # Création d'une fonction d'affichage d'une fenêtre contenant les textes de la classe
    def affiche_cart():
     
        num_carte = Label(root, text=str(carte_i.get_num()), bg="white", width=5, font=("Courier Bold", 30))      # Création d'un Label
        pers_carte = Label(root, text=str(carte_i.get_pers()), bg="#f2f8a7", width=25)
        obj_carte = Label(root, text=str(carte_i.get_obj()), bg="#b7e8e6", width=25)
        act_carte = Label(root, text=str(carte_i.get_act()), bg="#d8b7e8", width=25)
        btn_next = Button(root, text="Suivant >", command=incr_i())
     
        num_carte.pack(padx=10, pady=10)           # Placement du Label
        pers_carte.pack(padx=10, pady=10)
        obj_carte.pack(padx=10, pady=10)
        act_carte.pack(padx=10, pady=10)
        btn_next.pack(padx=10, pady=10)
     
        root.mainloop()
     
     
    print("Personnes : ", liste_pers)
    print("Actions : ", liste_act)
    print("Objets : ", liste_obj)
     
    # Appel de la fonction d'affichage de la carte correspondant à i
    affiche_cart()
    Merci beaucoup !

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Bonjour,

    Désolé je suis sur mobile donc difficile de debugguer ...

    A première vue j’ai limpression que vous incrémentez une variable («*i*») mais celle ci ne semble pas être utilisée dans la frame tkinter...

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nicaragua

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 68
    Par défaut
    Bonjour

    Mon idée était que Tkinter affiche les valeurs de l'instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    carte_i = FlashCard(i, liste_pers[i], liste_obj[i], liste_act[i])
    de la classe
    Les valeurs étant prises dans le rang "i" des trois tableaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste_pers = ["Dompteur", "Adam", "Lucy", "Pythagore", "Français", "Mime"]
    liste_obj = ["Des anneaux pour sauter", "Une pomme", "Un gourdin", "Une équère", "Une baguette", "Des gants blancs"]
    liste_act = ["Dompter un fauve", "Manger une pomme", "Taper avec un gourdin", "Mesurer un angle", "Manger une baguette", "Mimer en silence"]
    De plus, la fonction s'appelant "loop", je pensais il s'agissait d'une boucle qui devrait donc tourner pour rafraîchir la fenêtre.

    Et c'est dans tout ça qu'il doit y avoir une erreur...

    P.S. Quand je change la valeur de "i" à la main et que je relance le programme, la fenêtre affiche bien les nouvelles "string" désignées par "i". Donc au moins cette partie, ça devrait aller...

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

    Citation Envoyé par Yobeco Voir le message
    J'ai créé une fonction qui devrait être activée par une pression sur le bouton, mais rien ne se passe...
    • Ou la variable "i" n'évolue pas comme je l'imagine (elle ne bouge pas), mais je ne sais pas encore utiliser un débogueur pour observer ça...
    • Ou c'est la fenêtre qui ne se rafraîchit pas, et donc qui ne prend pas en compte l'évolution de ma variable "i".

    Je penche plus vers la seconde hypothèse, mais on ne sait jamais...
    La commande "print" devrait vous permettre de répondre à ces questions.
    Après pour apprendre à utiliser tkinter, pas la peine de vous lancer dans des codes aussi compliqués: vous allez juste vous perdre à vous poser des questions sans trop savoir ce qui marche ou pas...

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

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nicaragua

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 68
    Par défaut
    Merci pour vos conseils.

    La commande "print" devrait vous permettre de répondre à ces questions.
    Effectivement... Je vais essayer ça.

    Après, pour apprendre à utiliser tkinter, pas la peine de vous lancer dans des codes aussi compliqués
    Très juste... Je viens de réaliser un code beaucoup plus court pour étudier mon problème : une simple fenêtre avec un "cadre" et un "bouton".
    Le voici :

    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
     
    # Import de la bibliothèque TKinter
    from tkinter import *
     
    # Création de la fenêtre et d'un cadre
    root = Tk()
    frame = Frame(root, background="#f6d5ba")
    frame.pack()
     
    # Création d'un canevas où afficher la valeur "i" plus tard
    cnv = Canvas(frame, width=200, height=100, bg="white")
    cnv.pack(padx=20, pady=10)
     
    # Variable à incrémenter
    i = 0
    print(i)
     
    # Fonction d'incrémentation de "i"
    def incr_i():
        global i
        i += 1
        print(i)
     
    # Création d'un bouton d'incrémentation
    btn = Button(frame, text="+1", command=incr_i())
    btn.pack(pady=10)
     
    # Appel de la fonction d'affichage
    root.mainloop()
    Le résultat est très surprenant pour moi.

    Au lancement de la fenêtre, la console m'affiche 2 "print" : le "0" avant incrémentation et un "1" (D'où sort-il ???) , alors que je ne clique pas sur le bouton...

    Si je remplace "i += 1" par "i += 2" dans "def incr_i():", mon deuxième "print" devient "2".
    Quand j'enlève ", command=incr_i()" des paramètres du bouton, seul le "print" 0 apparaît.
    Il semble donc bien que le bouton se "déclenche" tout seul et incrémente "i" au démarrage.

    Par contre, quand j'appuie sur le bouton : aucun "print" n'apparaît !!!
    J'aurais créé un bouton qui se déclencherait seulement au démarrage mais pas en le cliquant ???

    Je suis perplexe... Qu'est-ce qui m'échappe donc ?

    Mais au moins, je crois que cette fois j'ai mis le doigt directement sur mon ignorance...

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

    Citation Envoyé par Yobeco Voir le message
    Par contre, quand j'appuie sur le bouton : aucun "print" n'apparaît !!!
    J'aurais créé un bouton qui se déclencherait seulement au démarrage mais pas en le cliquant ???
    voilà... et toute la différence est entre command=incr() et command=incr...
    Çà se ressemble mais dans un cas on passe à command le résultat de l'appel à la fonction et dans l'autre la fonction à appeler.

    Subtil? La machine se contente d'exécuter les instructions que vous lui demandez d'exécuter, ni plus ni moins...

    La difficulté est d'arriver à relire son code en se mettant à la place de la machine.

    Parfois on ne comprend pas comment le code qu'on a écrit se comporte de façon inattendue... et on a beau le relire, on passera à côté jusqu'à se qu'on se pose de bonnes questions.

    Et vous n'êtes qu'au début, car vous ne faites pas de choses très compliquées, juste jouer avec les fonctionnalités de base de tkinter. Imaginez avoir à écrire un programme un peu touffu de quelques milliers de lignes...

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

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nicaragua

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 68
    Par défaut
    Voilà... et toute la différence est entre command=incr_i() et command=incr_i ...
    Ah ouiiii !
    Effectivement !!! Et c'est un peu traître en plus, parce qu'il n'y avait aucun message d'erreur...

    Maintenant "i" s'actualise bien dans ma petite fenêtre d'essai. :-)

    La difficulté est d'arriver à relire son code en se mettant à la place de la machine.
    Parfois on ne comprend pas comment le code qu'on a écrit se comporte de façon inattendue... et on a beau le relire, on passera à côté jusqu'à se qu'on se pose de bonnes questions.
    C'est là qu'étaient mes plus grandes craintes quand j'ai commencé à programmer : rester bloqué dans mon incompréhension... (Et c'est là que la communauté est un joker qui permet probablement à beaucoup d'apprentis de ne pas abandonner, dégoûtés... )

    Imaginez avoir à écrire un programme un peu touffu de quelques milliers de lignes...
    C'est pour ça que j'ai toujours eu de l'admiration pour les développeurs : esprit logique et structuré, esprit de synthèse, imagination, recherche de l'efficacité, ténacité face à la difficulté... :-)

    Dés que j'ai le temps, j'applique cette correction à mon projet de "Cartes flashs" et je reviens.

    Merci !

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

    Citation Envoyé par Yobeco Voir le message
    Effectivement !!! Et c'est un peu traître en plus, parce qu'il n'y avait aucun message d'erreur...
    Quand il y a un message d'erreur, c'est (presque) facile!
    Ici, le problème est dans la traduction de l'idée en code et le manque de relecture: c'est devant vos yeux mais vous ne le voyez pas.

    Citation Envoyé par Yobeco Voir le message
    C'est là qu'étaient mes plus grandes craintes quand j'ai commencé à programmer : rester bloqué dans mon incompréhension...
    Le code, c'est juste du texte que vous pouvez modifier sans trop de problèmes (imaginez une construction en bois ou en métal, défaire et refaire est plus compliqué). Essayez de réduire votre problème à un code minimal qui permette de reproduire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from tkinter import *
     
    i = 0
    print(i)
     
    def incr_i():
        global i
        i += 1
        print(i)
     
    btn = Button(text="+1", command=incr_i)
    btn.pack()
     
    mainloop()
    et supprimez les commentaires: vous allez avoir tendance à lire les commentaires alors que vous devez apprendre à relire le code (çà ne vous aide pas à faire cet effort!).

    - 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. [Python 2.X] Interface Tkinter pour questionnaire
    Par Invité dans le forum Tkinter
    Réponses: 1
    Dernier message: 27/04/2017, 16h03
  2. Entry interface Tkinter
    Par Cerise22 dans le forum Tkinter
    Réponses: 2
    Dernier message: 05/07/2016, 14h35
  3. importer une liste à partir d'une interface Tkinter
    Par paxapaxa dans le forum Général Python
    Réponses: 7
    Dernier message: 09/06/2016, 21h06
  4. pb interface tkinter dans fichier à part
    Par v_floyd_6 dans le forum Tkinter
    Réponses: 2
    Dernier message: 24/04/2008, 16h33
  5. [matplotlib] Croubes dans une interface tkinter
    Par vinzzzz dans le forum Tkinter
    Réponses: 2
    Dernier message: 08/12/2006, 14h34

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