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 :

Identifier si ma classe(tk.frame) a dans son path 'canvas.create_windows'


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut Identifier si ma classe(tk.frame) a dans son path 'canvas.create_windows'
    Bonjour,
    Soit ma classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Ma_classe(tkinter.Frame):
        def __init__(self,root, text=None,font=None, bg=None,fg='black',
            height=64,width= 64,image=None, **arg):
            tkinter.Frame.__init__(self, root)
    Selon le path de ma classe, celle ci doit effectuer un traitement différant. En particulier, je cherche à identifier si ma classe est employée ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    root = tk.Tk()
    canvas = tk.Canvas(root)
    canvas.grid()
    frame = tk.Frame()
    w = Ma_classe(frame)
    canvas.create_window(window=frame)
    root.mainloop()
    J'ai essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def __init__(self,root, text=None,font=None, bg=None,fg='black',
                     height=64,width= 64,image=None, **arg):
            tkinter.Frame.__init__(self, root)
            print("self.winfo_parent", self.winfo_parent)
            idframe = self.winfo_id()
            print('id : ', idframe)
            print('nom du bouton: ', self.winfo_name())
            print ("pathname : ", self.winfo_pathname(idframe))
            if self.winfo_pathname(idframe)== ".!frame.!Ma_classe":
                print('Fais ceci')
            else:
                print("Fais cela")
    Cependant, procédant ainsi je ne peux pas distinguer si Ma_classe a été mise en oeuvre "depuis canvas.create_windows" ou pas.
    Comment procéder? Merci

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

    Pour qu'un widget soit parent d'un autre widget, il faut déjà le créer avec ce parent là (ou avec un de ses descendants).

    Si on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    root = tk.Tk()
    canvas = tk.Canvas(root)
    canvas.grid()
    frame = tk.Frame()
    w = Ma_classe(frame)
    canvas et frame ont un même parent (explicité pour canvas via root et implicite pour la frame puisque "root" sera le défaut).

    Le parent d'un widget est accessible via l'attribut "master"... et on peut récursivement parcourir ce chaînage pour savoir si... A l'opposé, les "enfants" d'un widgets sont accessibles via l'attribut "children" qui est un dictionnaire.

    note - la désignation "master" m'a toujours paru surprenante. On a une relation hiérarchique (parents/enfants) entre les différents widgets qui va servir aux gestionnaires de positionnement (pack, grid,...) à savoir dans quel "parent", on va afficher le widget "par défaut". Mais on peut changer ce défaut (avec parfois quelques surprises côté z-order) et là on a une relation "slaves" / "master" qui n'est plus hiérarchique.

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

  3. #3
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    merci @wiztricks.
    Avec root.children j'obtiens l'information recherchée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class RButton(tkinter.Frame):
        def __init__(self,root, text=None,font=None, bg=None,fg='black',
                     height=64,width= 64,image=None, **arg):
            tkinter.Frame.__init__(self, root)
            enfants =root.children
            out = "fait cela"
            for enfant in enfants:
                print(enfant)
                if str(enfant) == "!canvas": 
                    out = "fait ceci"
                    break
            print(out)
    Par contre, je n'ai pas su mettre en place la recherche de ma condition depuis self.master. (je peux me contenter de la première approche, je suis juste curieux ).

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

    Citation Envoyé par Hominidé Voir le message
    Par contre, je n'ai pas su mettre en place la recherche de ma condition depuis self.master. (je peux me contenter de la première approche, je suis juste curieux ).
    Honnêtement, je ne comprends pas trop ce que vous cherchez à faire.
    A l'instant t, un widget devra s'afficher dans une fenêtre ou à l'intérieur du rectangle définit par un autre widget.

    Donc si on part à dire, je crée ce Frame pour qu'il soit affiché dans un Canvas autant que le parent soit le Canvas. Ce qui, si je dois spécialiser une Frame, permettra de le différentier facilement via le type de self.master. D'autant que trouver un Canvas dans les descendants du parent n'indique en rien qu'on voudra afficher cette Frame dans ce Canvas.

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

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Honnêtement, je ne comprends pas trop ce que vous cherchez à faire.

    - W
    En fait, je m'essaie à la création d'une classe Bouton Rond pour tkinter.
    Nom : Rbutton.png
Affichages : 401
Taille : 304,0 Ko

    Pour gérer le bg des angles des boutons, j'ai besoin de savoir dans quel contexte l'utilisateur a utilisé ma classe. à ce stade, mon bouton fonctionne correctement si il est affiché dans une frame ou sur la fenêtre principale.
    Si le bouton est affiché sur un canvas, ma classe doit procéder différemment (dans mon image les angles sont non traités pour le bouton placé sur l'image du canvas...) ... J'ai fait cependant des essais concluant avec PIL Image.crop pour 'réafficher les pixels manquant' de l'image du canvas.
    Ma difficulté est de 'voir' depuis ma classe, comment l'utilisateur utilise ma classe pour en modifier son comportement.
    Je vais poursuivre mon étude sur le sujet. Je reviendrais probablement avec d'autres questions.
    Merci encore

  6. #6
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    me revoilà
    Je suis confronté à un autre souci que je n'avais pas prévu:
    Est-il possible depuis ma classe de récupérer le nom du fichier de l'image que l'utilisateur final a placée sur son canevas? (sans le transmettre par argument à ma classe: j'aimerai que ma classe s'utilise avec la même grammaire que le tk.Button)

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

Discussions similaires

  1. Identifier une classe C++ (non managee) dans C#
    Par Keitamax dans le forum C#
    Réponses: 0
    Dernier message: 27/04/2010, 17h49
  2. Intégrer des classes d'autre projets dans son JAR
    Par romaintaz dans le forum Maven
    Réponses: 7
    Dernier message: 20/02/2008, 12h02
  3. Réponses: 2
    Dernier message: 09/08/2005, 08h51
  4. [Applet]utiliser une classe d'un package dans une applet
    Par jeromejanson dans le forum Applets
    Réponses: 1
    Dernier message: 30/06/2005, 08h13
  5. Réponses: 4
    Dernier message: 15/01/2004, 22h53

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