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 :

Retrouver ses petits


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Retrouver ses petits
    C'est la première fois que je poste ici. Bonjour à tous.
    C'est aussi le première fois que j'utilise Python et Tkinter mais j'ai un gros passif en VB6 et plein de (mauvaises) habitudes.

    Comment obtenir une liste des enfants (et petits enfants éventuels) d'un widget depuis l'événement qu'il a provoqué ?
    Par exemple, changer le texte d'un 'Button' ayant une "Frame" pour parent suite à un événement reçu par la "Frame".

    Merci.

    Yves.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Yves07 Voir le message
    C'est la première fois que je poste ici. Bonjour à tous.
    C'est aussi le première fois que j'utilise Python et Tkinter mais j'ai un gros passif en VB6 et plein de (mauvaises) habitudes.

    Comment obtenir une liste des enfants (et petits enfants éventuels) d'un widget depuis l'événement qu'il a provoqué ?
    Par exemple, changer le texte d'un 'Button' ayant une "Frame" pour parent suite à un événement reçu par la "Frame".

    Merci.

    Yves.
    Bonjour,

    Une petite immersion dans l'excellent ouvrage de G. Swinnen serait probablement un bon début.

    http://python.developpez.com/cours/apprendre-python3/

    Bienvenu chez nous.

    @+.

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

    Citation Envoyé par Yves07 Voir le message
    Comment obtenir une liste des enfants (et petits enfants éventuels) d'un widget depuis l'événement qu'il a provoqué ?
    Par exemple, changer le texte d'un 'Button' ayant une "Frame" pour parent suite à un événement reçu par la "Frame"..
    Tous les widgets crées par Tk sont insérés dans une structure de nommage hiérarchique et tkinter (le côté Python) s'aligne dessus.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import tkinter as tk
    >>> app = tk.Tk() # crée une root ayant pour nom '.'
    >>> frame = tk.Frame(name='frame') # crée un fils de root ayant pour nom '.frame' et frame.master pour parent
    >>> button = tk.Button(frame, name='button') # crée un fils de frame ayant pour nom '.frame.button'
    >>> frame.children # retourne les fils de... frame
    {'button': <tkinter.Button object at 0x026195F0>}
    >>>
    Par défaut, on ne précise pas "name", tkinter va lui coller un identifiant construit d'après id(self) (un entier sous forme "str").

    Le plus simple est de commencer par regarder la documentation de tkinter donnée ici.

    Bon courage,
    - W

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Hello,

    Je n'avais pas le bouquin de Swinnen (c'est fait) mais j'ai celui Shipman sur Tkinter.

    La bonne nouvelle est qu'il n'est pas nécessaire de préciser "name" lors de la création.
    C'était la gestion de ce nom qui créait indirectement le problème.
    Il n'est donc pas résolu, mais la cause est éliminée.
    Du coup, mon code implose en se simplifiant considérablement.
    Une rapide vérification le confirme.

    pb = 10000
    pb -= pb

    Plus que 9999, on avance

    Yves.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Yves07 Voir le message
    Hello,

    Je n'avais pas le bouquin de Swinnen (c'est fait) mais j'ai celui Shipman sur Tkinter.

    La bonne nouvelle est qu'il n'est pas nécessaire de préciser "name" lors de la création.
    C'était la gestion de ce nom qui créait indirectement le problème.
    Il n'est donc pas résolu, mais la cause est éliminée.
    Du coup, mon code implose en se simplifiant considérablement.
    Une rapide vérification le confirme.

    pb = 10000
    pb -= pb

    Plus que 9999, on avance

    Yves.
    Si vous avez un bout de code à publier ici (avec le bouton "#" en haut à droite de l'éditeur de messages du forum)

    cela pourrait peut-être nous aider à y voir plus clair ?

    pour avoir la liste des enfants d'un widget : widget.winfo_children() voir cette doc http://infohost.nmt.edu/tcc/help/pub...universal.html

    extrait :

    w.winfo_children()
    Returns a list of all w's children, in their stacking order from lowest (bottom) to highest (top).
    pour connaître le nom de classe de chaque enfant : widget.winfo_class() (même doc)

    extrait :

    w.winfo_class()
    Returns w's class name (e.g., 'Button').
    pour modifier -par exemple- le texte d'un widget (qui supporte cette option) : widget.configure(text="nouveau texte") (même doc)

    extrait :

    w.configure(option=value, ...)
    Set the values of one or more options. For the options whose names are Python reserved words (class, from, in), use a trailing underbar: 'class_', 'from_', 'in_'.

    You can also set the value of an option for widget w with the statement

    w[option] = value
    If you call the .config() method on a widget with no arguments, you'll get a dictionary of all the widget's current options. The keys are the option names (including aliases like bd for borderwidth). The value for each key is:

    for most entries, a five-tuple: (option name, option database key, option database class, default value, current value); or,

    for alias names (like 'fg'), a two-tuple: (alias name, equivalent standard name).
    pour attacher un événement clic à une Frame, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    frame = tkinter.Frame(root)
    frame.bind("<Button-1>", on_frame_clicked)
     
    def on_frame_clicked (event):
        # on parcourt les enfants de la frame
        for w in frame.winfo_children():
            if w.winfo_class().lower() == "button":
                w.configure(text="nouveau texte")
            # end if
        # end for
    # end def
    etc, etc, et caetera desunt, comme dirait l'autre.

    @+.

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Oui, c'est bien de ce bouquin dont je me sers pour Tk.
    Il semble bien que tout ce qu'il faut savoir y soit écrit, la difficulté est qu'au départ on ne sait même pas ce qu'on cherche
    Comprendre Tk est moins facile que comprendre Python

    Pour le code, y'en a déjà 700 lignes et c'est pas simple d'en extraire les parties "pertinentes", quoi que le faire m'obligerait à prendre un peu de recul . . .

    J'y retourne immédiatement !

    Yves.

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Yves07 Voir le message
    Bonjour,

    Si vous faites un générateur de GUI tkinter pour apprendre Python/Tkinter alors ma question sera : pourquoi ne pas utiliser les classes dans votre script ?

    En revanche, si vous cherchez à résoudre un problème technique ou un manque style GUI builder, jetez peut-être un coup d'oeil à l'existant :

    https://pypi.python.org/pypi/tkRAD

    Documentation en français de tkRAD : https://github.com/tarball69/tkRAD/wiki/Accueil

    Si ça se trouve, quelqu'un a déjà résolu le problème.

    @+.

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Bonjour,

    Si vous faites un générateur de GUI tkinter pour apprendre Python/Tkinter alors ma question sera : pourquoi ne pas utiliser les classes dans votre script ?
    Oui, c'est d'abord pour apprendre.
    Je suis un peu hermétique à la syntaxe "classieuse" ou "classique" et ce qui me plaît avec Python c'est qu'on peut s'en passer.
    Hormis le style, quels sont les avantages ?
    En revanche, si vous cherchez à résoudre un problème technique ou un manque style GUI builder, jetez peut-être un coup d'oeil à l'existant :

    https://pypi.python.org/pypi/tkRAD

    Documentation en français de tkRAD : https://github.com/tarball69/tkRAD/wiki/Accueil
    Ca se terminera peut être comme ça

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Yves07 Voir le message
    Oui, c'est d'abord pour apprendre.
    Je suis un peu hermétique à la syntaxe "classieuse" ou "classique" et ce qui me plaît avec Python c'est qu'on peut s'en passer.
    Hormis le style, quels sont les avantages ?
    Style ?

    Une classe est une structure, à la base. Elle sert donc à structurer le code.

    En plus, avec l'énorme avantage de l'encapsulation des tâches, une classe vous permet d'avoir un code beaucoup plus clair à relire et à déboguer.

    Sans parler du principe du composant logiciel réutilisable et/ou dérivable (pour augmenter ses capacités).

    Nan, pour les grosses applis, y a pas photo : la classe, c'est la classe !

    @+.

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Pour fermer le fil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def getchildren(p):
        for x in p.winfo_children():
            print "parent/child", p, x 
            getchildren(x)
    Montre tous les descendants de p.

    Merci.

    Yves.

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

Discussions similaires

  1. histoire de chemins ou comment retrouver ses petits?
    Par topor dans le forum VBScript
    Réponses: 3
    Dernier message: 30/10/2012, 14h58
  2. [AC-2010] Comment retrouver ses petits (ancien de AC2003)
    Par petitours dans le forum IHM
    Réponses: 6
    Dernier message: 15/06/2012, 11h29
  3. Checkbutton et ses petites complications
    Par ApprentiOracle dans le forum Tkinter
    Réponses: 2
    Dernier message: 09/03/2007, 17h34
  4. Retrouver ses images.
    Par hasan dans le forum Java ME
    Réponses: 3
    Dernier message: 12/04/2006, 10h52
  5. Retrouver ses partitions
    Par Michaël dans le forum Composants
    Réponses: 2
    Dernier message: 03/04/2006, 19h56

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