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 :

tkinter : pourquoi faut-il un retour de valeur pour une fonction affichage ? [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut tkinter : pourquoi faut-il un retour de valeur pour une fonction affichage ?
    Bonjour,
    en continuant mon apprentissage, j'utilise tkinter comme beaucoup.
    Pour afficher un labyrinthe j'utilise la fonction suivante :
    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
    def aff_lab(lab, fenetre):
        """
            Affichage d'un labyrinthe
            
            lab : liste contenant le labyrinthe
    
            pas de valeur de retour
        """
        # Rq : la taille des sprites pourrait être un paramètre
        toile = Canvas(fenetre, width = 600, height = 600)
    
        coin    = PhotoImage(file = "sprites/angle.png")
        mur_h   = PhotoImage(file = "sprites/mur_h.png")
        mur_v   = PhotoImage(file = "sprites/mur_v.png")
        sol     = PhotoImage(file = "sprites/sol.png")
        sortie  = PhotoImage(file = "sprites/sortie.png")
        ennemie = PhotoImage(file = "sprites/ennemie.png")
        tresor  = PhotoImage(file = "sprites/coffre_ferme.png")
    
        n_ligne = 0
        for ligne in lab :
            n_col = 0
            for car in ligne :
                if car == "+" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = coin)
                if car == "-" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = mur_h)
                if car == "|" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = mur_v)
                if car == " " :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = sol)
                if car == "1" or car == "2" or car == "3" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = tresor)
                if car == "$" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = ennemie)
                if car == "S" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = sortie)
                n_col += 1
            n_ligne += 1
        toile.pack()
        return (toile, {
            "coin" : coin,
            "mur_h" : mur_h,
            "mur_v" : mur_v,
            "sol" : sol,
            "sortie" : sortie,
            "ennemie" : ennemie,
            "tresor" : tresor})
    La partie en rouge m'interroge.
    Elle m'oblige à l'appeler par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        (toile, sprites) = M_Lab_01.aff_lab(level, fenetre)
    Pourquoi faut-il un retour de valeur alors que la fonction ne fait qu'afficher avec, de plus, la création de deux variables (toile, sprites) dont je ne me sert pas.
    J'ai évidemment essayé sans et une fenêtre vide s'ouvre mais pas de labyrinthe.
    Merci de vos lumières.
    Sylvain.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Sans doute que ton code a besoin de conserver une référence des objets.

    Ceux-ci sont créés dans une fonction et pourraient voir leur durée de vie limitée à l'espace de nom de cette fonction, c'est-à-dire pas longtemps.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,
    Sans doute que ton code a besoin de conserver une référence des objets.
    Bonjour,
    c'est bien cela que je ne comprend pas.
    Suit le code "complet" du programme principal :
    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 *
    import M_Lab_01
     
    if __name__=="__main__":
     
        fenetre = Tk()
        fenetre.title("Labyrinthe graphique sans le héro")
     
        level = M_Lab_01.charge_lab("level_1")
     
        (toile, sprites) = M_Lab_01.aff_lab(level, fenetre)
     
        fenetre.mainloop()
    Ce serait la méthode mainloop qui en aurait besoin ?
    Sylvain.

  4. #4
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par SPC89 Voir le message
    Bonjour,
    c'est bien cela que je ne comprend pas.
    Suit le code "complet" du programme principal :
    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 *
    import M_Lab_01
     
    if __name__=="__main__":
     
        fenetre = Tk()
        fenetre.title("Labyrinthe graphique sans le héro")
     
        level = M_Lab_01.charge_lab("level_1")
     
        (toile, sprites) = M_Lab_01.aff_lab(level, fenetre)
     
        fenetre.mainloop()
    Ce serait la méthode mainloop qui en aurait besoin ?
    Sylvain.
    Alors une variable définie dans une fonction n'est utilisable que dans cette fonction.

    Afin de l'utiliser en dehors de cette fonction il faut la définir en variable global (pas très recommandé), sinon tu demandes à ton programme de faire un retour (return) de cette variable afin de pouvoir l'utiliser en dehors de la fonction qui l'utilise.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> def somme(a,b):
    	s = a + b
     
     
    >>> somme(1,2)
    >>> print s
     
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        print s
    NameError: name 's' is not defined
    Maintenant avec return :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> def somme(a,b):
    	s = a + b
    	return s
     
    >>> z = somme(1,2)
    >>> print z
    3
    Dans ton cas le programme retourne un tuple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    return (toile, {
            "coin" : coin,
            "mur_h" : mur_h,
            "mur_v" : mur_v,
            "sol" : sol,
            "sortie" : sortie,
            "ennemie" : ennemie,
            "tresor" : tresor})
    Mais le principe reste le même.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par SPC89 Voir le message
    Ce serait la méthode mainloop qui en aurait besoin ?
    Lancez la console Python et essayez ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> image = tk.PhotoImage(file='image.gif')
    >>> tk.Label(root, image=image).pack()
    >>>
    à ce moment là, vous devez voir l'image affichée.
    Maintenant, on va "déréférencer" l'image:
    et l'image disparaît laissant un rectangle blanc.

    Si vous débutez avec tkinter, il faut prendre connaissance des entrées de la FAQ. Elles listent la plupart des soucis rencontrés par les débutants, celle ci est Comment afficher une image sur un Widget.

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Si vous débutez avec tkinter, il faut prendre connaissance des entrées de la FAQ. Elles listent la plupart des soucis rencontrés par les débutants, celle ci est Comment afficher une image sur un Widget.
    - W
    OK, merci.
    C'est vrai que la réponse est dans cette faq, mais on (je) ne pense pas à chercher quand le problème semble illogique. Ne sachant programmer qu'en assembleur, je suis toujours surpris par les subtilités des langages évolués.
    Du coup, pas facile de savoir où chercher.
    Merci encore.
    Sylvain.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par SPC89 Voir le message
    C'est vrai que la réponse est dans cette faq, mais on (je) ne pense pas à chercher quand le problème semble illogique. Ne sachant programmer qu'en assembleur, je suis toujours surpris par les subtilités des langages évolués.
    Du coup, pas facile de savoir où chercher.
    Le plus simple est de s'efforcer de les lire à tête reposée.
    C'est formateur (vous apprendrez de choses même si vous n'en avez pas besoin immédiatement) et çà vous permet de mémoriser assez pour que dans certains cas vous vous disiez "tiens, çà me rappelle quelque chose".

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

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a longtemps que je n'ai pas utilisé tkinter, mais je me rappelais d'une superbe documentation que j'utilisais souvent: elle existe toujours, et elle est même citée comme référence dans la documentation Python.

    Elle est ici:

    http://infohost.nmt.edu/tcc/help/pub...web/index.html

    Les bibliothèques graphiques sont complexes, et je pense qu'on perd beaucoup de temps si on n'a pas la doc en ligne pendant qu'on code. Et ça ne concerne pas que les débutants...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Il y a longtemps que je n'ai pas utilisé tkinter, mais je me rappelais d'une superbe documentation que j'utilisais souvent: elle existe toujours, et elle est même citée comme référence dans la documentation Python.

    Elle est ici:

    http://infohost.nmt.edu/tcc/help/pub...web/index.html
    Depuis que nombre de bacheliers apprennent à programmer avec Python, elle a été traduite et sa traduction se trouve ici. Et pour ceux qui voudraient autre chose, la liste des autres documentations est disponible dans la discussion ressources tkinter.

    Citation Envoyé par tyrtamos Voir le message
    Les bibliothèques graphiques sont complexes, et je pense qu'on perd beaucoup de temps si on n'a pas la doc en ligne pendant qu'on code. Et ça ne concerne pas que les débutants...
    Pour les moins débutants, la documentation en ligne est celle de TCL/Tk (dont il existe une traduction dans ressources tkinter).
    Ceci dit, le problème rencontré par le PO n'est généralement pas dans les documentations (s'il y est, c'est bien caché), c'est ce qui fait l'intérêt des FAQ.

    - 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. [MySQL] Retour de valeur pour une requête "select"
    Par Truebison dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/09/2008, 16h57
  2. Retour de valeur d'une fonction
    Par guigouz dans le forum SQL
    Réponses: 5
    Dernier message: 10/06/2008, 15h21
  3. [Tableaux] Retour de valeur d'une fonction
    Par Trebor_ dans le forum Langage
    Réponses: 5
    Dernier message: 10/03/2008, 14h24
  4. [Mail] Retour de valeur d'une fonction
    Par pat06 dans le forum Langage
    Réponses: 3
    Dernier message: 14/12/2007, 11h32
  5. Réponses: 18
    Dernier message: 21/10/2006, 19h10

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