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

  1. #1
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    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

  3. #3
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    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

  5. #5
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    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 : 352
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 expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    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)

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

    Citation Envoyé par Hominidé Voir le message
    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?
    Une fois que l'image est affichée dans le canvas, le Canvas permet juste d'y accéder via le numéro/tag de l'item qu'il a fabriqué avec. On devrait pouvoir récupérer l'objet image associé mais arrivé là pour récupérer le fichier, je n'ai rien trouvé.

    Mais vous allez alors tomber sur une restriction des objets Variable/Image de l'implémentation de tkinter: si on détruit l'objet Image, il n'y a pas de compteur des widgets qui l'utilisent. La variable Tk associée disparait et l'affichage de l'image aussi.
    => La même image utilisée par plusieurs widgets implique des références côté Python (un dictionnaire "global").

    Et je ne vois pas comment on peut réaliser çà sans passer quelque chose: l'identifiant de l'item, la clef du dictionnaire ou l'image...

    - W

  8. #8
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    Par défaut
    C'est entendu. Merci

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 896
    Points : 7 256
    Points
    7 256
    Par défaut
    Bonjour,

    Désolé, un peu de retard pour répondre, mais quelque-chose me titille.

    Quand je vois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    frame = tk.Frame()
    w = Ma_classe(frame)
    et le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    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)
    Je me dis que vous ne comprenez pas bien l'héritage de classe.

    Dans l'instanciation de la classe, vous attendez un objet Frame comme paramètre d'initialisation, alors que dans votre code, vous attendez des paramètres nommés représentant des configurations d'un objet Widget.

    Le code pourrait s'écrire plus justement,

    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 Tk, Frame
     
    class Ma_classe(Frame):
        def __init__(self, root,  text=None,font=None, bg=None,fg='black',
            height=64,width= 64,image=None, **arg):
            super().__init__(master=root, font=font, bg=bg, height=height, width=width, image=image)
            self.text = text
            self.fg = fg
     
     
    root = Tk()
    ma_classe = Ma_classe(root, text="test", bg="white")
    ma_classe.pack()
    root.mainloop()

  10. #10
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    Par défaut
    Bonjour Fred,
    Oui effectivement. Par ailleurs, je n'ai nullement besoin de cet héritage pour la conception de mon objet. Il s'agissait d'un résidu de mes différents essais.
    Sinon, je vois que tu utilises la méthode super(). Je n'ai jamais vraiment compris ce qui justifie son utilisation.*
    Pourquoi ne pas écrire simplement frame.init(...) ?
    J'ai déjà interrogé des personnes sur le sujet, mais personne n'a su m'expliquer pourquoi ils utilisaient super().

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 896
    Points : 7 256
    Points
    7 256
    Par défaut
    Tu as toutes les explications (en tout cas je peux pas faire plus détaillé) avec des exemples sur ce topic.

    Bonne lecture

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    J'ai déjà interrogé des personnes sur le sujet, mais personne n'a su m'expliquer pourquoi ils utilisaient super().
    Python est un langage à héritage multiple. Si une classe hérite de A et de B, il faudrait appeler A.__init__ et B.__init__ dans le bon ordre.

    super() calcule cela à notre place et évite d'avoir à se prendre le chou si on change l'héritage de B, A à A, B...

    - W

  13. #13
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    895
    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 : 895
    Points : 1 572
    Points
    1 572
    Billets dans le blog
    5
    Par défaut
    Bonjour,
    Fred: J'ai pas encore pris le temps d'étudier le lien . Je l'ai juste lu en diagonale. Il renvoit vers autre lien qui me semble plutôt explicite: https://xo3defukjz6q75rl224hyhyaua-a...sidered-super/
    J'en étudirais les exemples lorsque je disposerais d'un peu de temps

    wiztricks:

    Belle journée à tous

+ 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