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 :

Le newbie est toujours là : traiter un événement dans une classe ?


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut Le newbie est toujours là : traiter un événement dans une classe ?
    Bonjour tout le monde, c'est toujours moi, avec mes problèmes...

    J'ai posé la question sur un autre forum, mais ils ne répondent pas... On en pensera ce qu'on voudra.

    Voila : je souhaite créer une classe comportant une frame sur laquelle je désire traiter le cas où l'utilisateur clique : alors, l'image de fond change, et une propriété de la classe change aussi.

    Si j'étais dans la programmation du "main", je mettrais dans mon appel de frame "command = clic", mais, puisque je suis dans la programmation d'une classe, je ne dois pas perdre le lien avec l'instance de la classe à laquelle ce clic se rapporte : en deux mots comme en cent, il faudrait (si j'ai bien compris python, ce qui n'est pas gagné, finalement) que cette routine soit appelée sous la forme "command='clic(self...)'". Or, à cela, je n'ai pas droit, me semble-t-il.

    Je suis très étonné de ne rien trouver qui m'aide chez mon ami Google, ce n'est pourtant pas faute de lui avoir posé des questions. Il faut croire que je ne sais pas bien lui poser mes questions.

    Quoi qu'il en soit, si certains d'entre vous comprennent mieux mon problème que lui, ils recevront des remerciements chaleureux s'ils veulent bien me communiquer leurs réponses.

    AMIcalement...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    en deux mots comme en cent, il faudrait (si j'ai bien compris python, ce qui n'est pas gagné, finalement) que cette routine soit appelée sous la forme "command='clic(self...)'". Or, à cela, je n'ai pas droit, me semble-t-il.
    Et si vous commenciez par ouvrir un tuto?

    Ça vous explique les classes avec Python et comme la programmation d'un GUI graphique est suffisamment compliquée pour en tirer profit, c'est plein d'exemples de code.
    Mon préféré est le Swinnen, vous avez tout un chapitre sur tkinter et les classes.

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

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Ah ça !!!! Je l'ai déjà vu, celui là ! Peut-être même plusieurs fois. Il y a quelque chose qui cloche là-dedans (pour que je n'aie opas vu que ça répondait à ma question). J'y retourne immédiatement.

    Merci.

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Re-bonjour.

    Alors voici ce que ça donne :
    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
    # -*- coding: utf8 -*- 
    """ Module des objets (widgets) utilisés dans l'émetteur.py
    (C) AMI 2018  """
    from tkinter import *
    from PIL import Image, ImageTk
    root=Tk()
    image=Image.open("./Images/InterF.jpg")
    BoutonFerme=ImageTk.PhotoImage(image)
    image=Image.open("./Images/InterO.jpg")
    BoutonOuvert=ImageTk.PhotoImage(image)
     
    class Inter:
     
        def __init__(self, nom, larg, haut, parent):
            """ Un Inter a un nom, une largeur, une hauteur et un parent.
            Il a aussi un état, ouvert ou fermé, que l'on change en cliquant"""
            self.BoutonO=ImageTk.PhotoImage(BoutonOuvert.resize(larg,haut))
            self.BoutonF=ImageTk.PhotoImage(BoutonFerme.resize(larg,haut))
            self.Etat="Ouvert"
            self.frame=Frame(Parent, width=larg,height=haut,bd=1,image=BoutonO)
            self.frame.bind("<Button-1>", self.bascule)
     
        def bascule(self):
            if self.Etat=="Ouvert":
                self.Etat="Fermé"
                self.frame.image=self.BoutonF
            else:
                self.Etat="Ouvert"
                self.frame.image=self.BoutonO
    Je place mon Inter dans une frame de ma fenêtre principale, et j'obtiens d'abord une petite fenêtre en plus (certainement le résultat de "root=Tk(), mais on verra plus tard) et ce message de IDLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      File "D:\Projets\Python\Télécommande\Mes_Objets.py", line 17, in __init__
        self.BoutonO=ImageTk.PhotoImage(BoutonOuvert.resize(larg,haut))
    AttributeError: 'PhotoImage' object has no attribute 'resize'
    Alors, comme promis, mes chaleureux remerciements, mais aussi un nouvel appel au secours, je rame !

    AMIcalement.

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

    Citation Envoyé par L'AMI Yves Voir le message
    ce message de IDLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      File "D:\Projets\Python\Télécommande\Mes_Objets.py", line 17, in __init__
        self.BoutonO=ImageTk.PhotoImage(BoutonOuvert.resize(larg,haut))
    AttributeError: 'PhotoImage' object has no attribute 'resize'
    Le message vous dit juste que PhotoImage ne connaît pas "resize".
    Donc vous cherchez dans votre documentation tkinter préférée ce que sait faire PhotoImage et vous y trouver comment redimensionner une PhotoImage ou bien (puisque vous êtes pressé) un peu de recherche sur Internet.
    Est ce si compliqué?

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

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Bon, ouais, c'est sans doute pas si compliqué pour ceux qui sont déjà passé par là, mais avant de poster ce message, j'aifait (au moins !) dix aller-retour entre mon IDLE (où tourne le programme principal, mon éditeur (où je modifie ma classe) et Internnet, où, l'air de rien, je fais quand-même des recherches. Et si j'ai codé ces lignes, c'est bien par ce que je les ai trouvées sur Internet.

    O vous qui êtes programmeurs Python chevronés, vous ne vous rendez pas (plus ?) compte de ce que c'est que de se battre contre Python 2 ou Python 3, contre PIL qui a disparu (ou c'est tout comme) et Pillow (qu'il faut quand mêmee chercher sous le nom de PIL, par compatibilité (ah ah !), contre de myriades de tutos ou d'exemples complètement obsolètes, après toutes ces disparitions (mais ces tutos et ces exemples ne sont absolument pas datés), contre même notre imbécile d'"ami" Google, qui nous donne, certes, LA bonne réponse à notre question, mais noyée dans une foule d'autres réponses qui n'ont absolument rien à voir, si ce n'est qu'elles contienne un ou deux mots (dans le désordre) de notre question.

    Enfin, bon, ça y est, j'ai vidé mon sac, ça va mieux, je me calme, et je vous adresse (enfin !) tous les remerciements que méritent votre patience et votre amabilité, sans parler de la promptitude de vos réponses.

    AMIcalement (et à bientôt...)

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Alors, après plusieurs corrections, en m'efforçant de suivre les recommandations qui m'ont été données, je n'ai plus de message d'erreur (j'ai toujours la petite frame supplémentaire)... mais mon "Inter" n'apparait pas dans ma frame !

    Voici où je l'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        frame_boutons= Frame(fenetre, width=int(lar*.55),height=int(hau*.20), bg="linen", bd=1)
        frame_boutons.grid(row=2,column=1,columnspan=2)
        bouton_contact=Mes_Objets.Inter("Contact",int(lar*.55*.25),int(hau*.20),frame_boutons)
    et voila comment je l'ai programmé :
    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
    # -*- coding: utf8 -*- 
    """ Module des objets (widgets) utilisés dans l'émetteur.py
    (C) AMI 2018  """
    from tkinter import *
    from PIL import Image, ImageTk
    root=Tk()
    BoutonFerme=Image.open("./Images/InterF.jpg")
    #BoutonFerme=ImageTk.PhotoImage(BoutonFerme)
    BoutonOuvert=Image.open("./Images/InterO.jpg")
    #BoutonOuvert=ImageTk.PhotoImage(BoutonOuvert)
     
    class Inter:
     
        def __init__(self, nom, larg, haut, parent):
            """ Un Inter a un nom, une largeur, une hauteur et un parent.
            Il a aussi un état, ouvert ou fermé, que l'on change en cliquant"""
            self.BoutonO=BoutonOuvert.resize((larg,haut))
            self.BoutonF=BoutonFerme.resize((larg,haut))
            self.Etat="Ouvert"
            self.frame=Frame(parent, width=larg,height=haut,bd=1)
            self.frame.image=self.BoutonO
            self.frame.bind("<Button-1>", self.bascule)
     
        def bascule(self):
            if self.Etat=="Ouvert":
                self.Etat="Fermé"
                self.frame.image=self.BoutonF
            else:
                self.Etat="Ouvert"
                self.frame.image=self.BoutonO
    Je le savais, je le savais ! En me mettant à Python, j'allais souffrir...

    Merci à ceux qui voudront bien encore soulager mes souffrances.

    AMIcalement.

  8. #8
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.frame.image=self.BoutonO
    Il n'y a pas d'attribut image dans les frames tkinter, utilise un Label à la place, ou autre widget permettant d'afficher une image.

  9. #9
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Ah ! D'accord. Bon, je vais tenter avec un cannevas, de toute façon, j'en aurai besoin par la suite.

    Accessoirement, quelle est la commande qui me permettrait de connaitre la liste des différents attributs de chaque composant d'un module ?

    Merci de me permettre d'avancer.

    AMIcalement.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Accessoirement, quelle est la commande qui me permettrait de connaitre la liste des différents attributs de chaque composant d'un module ?
    Le documentation est faite pour çà non?

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

  11. #11
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Pour répondre à Bistouille, voici le code corrigé :
    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
    # -*- coding: utf8 -*- 
    """ Module des objets (widgets) utilisés dans l'émetteur.py
    (C) AMI 2018  """
    from tkinter import *
    from PIL import Image, ImageTk
    #root=Tk()
    BoutonFerme=Image.open("./Images/InterF.jpg")
    #BoutonFerme=ImageTk.PhotoImage(BoutonFerme)
    BoutonOuvert=Image.open("./Images/InterO.jpg")
    #BoutonOuvert=ImageTk.PhotoImage(BoutonOuvert)
     
    class Inter:
     
        def __init__(self, nom, larg, haut, parent):
            """ Un Inter a un nom, une largeur, une hauteur et un parent.
            Il a aussi un état, ouvert ou fermé, que l'on change en cliquant"""
            self.BoutonO=BoutonOuvert.resize((larg,haut))
            self.BoutonF=BoutonFerme.resize((larg,haut))
            self.Etat="Ouvert"
            self.cannevas=Canvas(parent, width=larg,height=haut,bd=1)
            self.cannevas.create_image(larg,int(haut*90),image=self.BoutonO)
            self.label=Label(parent, text=nom)
            self.cannevas.bind("<Button-1>", self.bascule)
     
        def bascule(self):
            if self.Etat=="Ouvert":
                self.Etat="Fermé"
                self.frame.image=self.BoutonF
            else:
                self.Etat="Ouvert"
                self.frame.image=self.BoutonO
    Résultat : sur la ligne où il y a "create-image", j'ai l'erreur que l'image n'existe pas...

    @Wiztricks : oui, il ne fait absolument aucun doute que la doc est faite pour ça, je n'aurais pas initialisé un nouveau fil pour cette question, mais là, j'ai parcouru quinze docs, j'ai rencontré (au moins !) trois fois cette information alors que je cherchais autre chose, et je suis gavé. J'ai posé "accessoirement" la question. Je sais bien que ça vous agace, vous les experts, mais veuillez bien voir que nous, les newbies, au bout d'un moment, on fatigue...

    D'ailleurs, c'est assez pour aujourd'hui : on verra la suite demain, à tête reposée (j'espère que je ne vais pas en rêver...)

    AMIcalement.

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Je sais bien que ça vous agace, vous les experts, mais veuillez bien voir que nous, les newbies, au bout d'un moment, on fatigue...
    Un forum de discussion n'est pas là pour réduire le temps que vous aurez à passer dans les tutos et la documentation pour apprendre. On peut juste essayer de vous aider à mieux comprendre et vous y renvoyer si vous n'avez même pas essayé de comprendre.

    Citation Envoyé par L'AMI Yves Voir le message
    mais mon "Inter" n'apparait pas dans ma frame !
    Relisez votre code:
    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
    class Inter:
     
        def __init__(self, nom, larg, haut, parent):
            """ Un Inter a un nom, une largeur, une hauteur et un parent.
            Il a aussi un état, ouvert ou fermé, que l'on change en cliquant"""
            self.BoutonO=BoutonOuvert.resize((larg,haut))
            self.BoutonF=BoutonFerme.resize((larg,haut))
            self.Etat="Ouvert"
            self.cannevas=Canvas(parent, width=larg,height=haut,bd=1)
            self.cannevas.create_image(larg,int(haut*90),image=self.BoutonO)
            self.label=Label(parent, text=nom)
            self.cannevas.bind("<Button-1>", self.bascule)
     
        def bascule(self):
            if self.Etat=="Ouvert":
                self.Etat="Fermé"
                self.frame.image=self.BoutonF
            else:
                self.Etat="Ouvert"
                self.frame.image=self.BoutonO
    Est-ce qu'il y a la dedans une instruction qui manifeste l'intention d'afficher quoi que ce soit? Alors si vous n'avez pas encore compris que pour qu'un widget s'affiche, il ne suffit pas de le créer....

    Si encore vous étiez en train de batailler pour faire l'exercice d'un tuto. mais non, vous avez la prétention (et l'arrogance) de vouloir écrire une application complexe sans prendre le temps d'apprendre à penser avec Python et tkinter?
    Ce dont on parle là, c'est de l'architecture de votre application, de la distribution des rôles et des responsabilités entre classes, modules,.... ce subtil équilibre qui fait que l'ouvrage tient la route ou s'écroule.
    Ce sont des choix non techniques et non des détails d'implémentation.

    Regardez votre class Inter, déjà ce n'est pas un widget mais la composition d'un Canvas et d'un Label. Comme rien et fait pour afficher quoi que ce soit, c'est à l'appelant de se démer... avec. Pourquoi pas mais il serait plus simple d'hériter de Frame, placer vos widget dedans et laisser à l'appelant afficher le tout où il veut comme il veut. C'est un choix parmi d'autres et pour que vous puissiez décider il faut avoir pris le temps d'apprécier avantages et inconvénients dans différents contextes.

    Et pour l'instant, il semble que vous n'ayez pas encore compris qu'il faut un peu plus que créer un widget pour qu'il s'affiche.... Apprécier l'étendue de son ignorance et se donner les moyens d'y pallier, c'est aussi un des aspects du boulot de programmeur: on ne sait pas tout sur tout au niveau des détails qu'il serait souhaitable, juste assez pour faire avec.

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

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par L'AMI Yves Voir le message
    Accessoirement, quelle est la commande qui me permettrait de connaitre la liste des différents attributs de chaque composant d'un module ?
    dir(composant).

    Citation Envoyé par wiztricks Voir le message
    La documentation est faite pour çà non?
    Dans l'absolu c'est exact. Toutefois là il s'agit d'un détail tellement mineur que pour le trouver dans les 370 pages de la documentation (exemple du Swinnen) ça devient assez galère. Donc peut-être qu'un petit coup de pouce gratuit...
    (PS: le Swinnen en parle juste une fois dans l'appendice de la page 128...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Dans l'absolu c'est exact. Toutefois là il s'agit d'un détail tellement mineur que pour le trouver dans les 370 pages de la documentation (exemple du Swinnen)
    Le Swinnen n'est pas une documentation mais un tuto. qui apprend les bases de la programmation. Une documentation officielle, c'est autre chose!
    Et si on ne la lit pas, on se retrouve à essayer de placer une image dans une Frame ou ré-inventer un Checkbutton. Et écrire un code qui non seulement ne fonctionne pas mais qu'en plus on aurait pu éviter d'écrire.
    Et (malheureusement), c'est pas avec "dir" ou "help" qu'on pourra se faire une idée de ce que font (ou pas) les différents widgets de tkinter, ni comment les composer si nécessaire.


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

  15. #15
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Eh oh ! Faut arrêter, là, quand-même. Oui, je suis impatient, oui, j'ai oublié le pack(), oui, je suis passé en planant au dessus de plein de truc dans toutes les pages de tutos et de doc que j'ai lues (et ça fait sûrement plus de 370), oui, il y a des trucs et des machins que j'aurais pu faire, et d'autres que j'aurais pu ne pas faire, mais m'appeler "prétencieux" et "arrogant", là, j'aime pas. Je me suis soigneusement présenté comme "newbye", j'ai fait des "exercices" pris dans des tutos, puis j'ai essayé de me lancer. Diriez-vous, monsieur l'expert, qu'elle est si bien faite, la documentation qu'on trouve sur Internet ? Avez-vous compté le nombre d'exemples qui y sont donnée et qui ne marchent pas ? Et ceux où une solution très compliquée est donnée là où une autre bien plus simple existe ? C'est vrai qu'il faut s'imprégner de la culture d'un langage, et que je n'ai évidemment pas eu le temps de le faire, mais c'est bien facile à ceux qui sont dedans depuis longtemps de détecter ça et de passer outre quasiment sans le remarquer.

    C'est bon, je vais m'efforcer de me montrer plus sérieux (on ne fait pas de l'humour et de la programmation en même temps !) et tenter d'atténuer ce que vous interprétez comme "errogance", mais je m'y reconnais tellement pas que ça risque d'être difficile.

    Et merci quand-même de continuer à me lire et de me répondre, à tous ceux qui qui l'ont fait.

    AMIcalement.

  16. #16
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    @wiztricks : J'ai bien fait le raisonnement que mon 'Inter' fonctionne exactement comme une case à cocher, et va jouer exactement le même rôle dans l'application finale, mais avec un aspect complètement différent. Est-ce qu'il serait possible de le faire hériter de la classe "checkbutton" ? Mon manque de connaissance ne me permet pas encore de répondre (ou plutôt, mon intuition me dit que c'est sans doute possible, mais je ne sais pas comment), mais ce que j'essaie de faire - en courant, au lieu d'avancer pas à pas, Ok... - c'est bien d’acquérir cette connaissance.

    Quand je demande à Google de m'aider à trouver "comment programmer mes propres widgets", il me renvoie des pages et des pages sur la façon d'utiliser les widgets de tkinter (et aussi de Tkinter, d'ailleurs) mais je n'ai rien trouvé de pertinent. Est-ce que je n'ai pas cherché assez loin dans les réponses de Google, est-ce que ma question est mal posée, est-ce encore autre chose ? j'ai l'impression de tourner en rond, et un impatient comme moi ne supporte pas ça très bien...

    A+

  17. #17
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Est-ce qu'il serait possible de le faire hériter de la classe "checkbutton" ? Mon manque de connaissance ne me permet pas encore de répondre (ou plutôt, mon intuition me dit que c'est sans doute possible, mais je ne sais pas comment)
    Oui c'est possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class MyCheckbutton(tk.Checkbutton):
             pass
    et voilà.

    mais comme un Checkbutton sait afficher text et image en même temps, peut être qu'utiliser le widget de base suffise (au moins dans un premier temps).

    Citation Envoyé par L'AMI Yves Voir le message
    mais ce que j'essaie de faire - en courant, au lieu d'avancer pas à pas, Ok... - c'est bien d’acquérir cette connaissance.
    Oui mais ce n'est pas possible sauf à surestimer les capacités de votre cerveau à emmagasiner toutes les connaissances à acquérir (ou en sous-estimer leur quantité).
    Car çà passe par la création de connexions entre neurones au terme d'un processus chimique assez lent par nature. C'est comme çà.

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

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Est-ce qu'il serait possible de le faire hériter de la classe "checkbutton" ? Mon manque de connaissance ne me permet pas encore de répondre (ou plutôt, mon intuition me dit que c'est sans doute possible, mais je ne sais pas comment), mais ce que j'essaie de faire - en courant, au lieu d'avancer pas à pas, Ok... - c'est bien d’acquérir cette connaissance.
    Déjà sais-tu créer une classe B qui hérite de A (j'ai parcouru tes posts mais je n'ai rien vu qui puisse confirmer ou infirmer si tu as cette connaissance). Donc dans le doute voici un petit exemple d'héritage
    Code python : 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
    class A(object):
    	# A est un objet qui hérite de l'objet primitif "object"
    	def __init__(self):
    		# Appel de l'init dont A hérite (donc l'init de "object")
    		super(A, self).__init__()
    		# Ici A contient les attributs publics de "object"
     
    		# Les attributs de A
    		self.attribA=123
    	# __init__()
    # class A
     
    class B(A):
    	# B est un objet qui hérite de l'objet A
    	def __init__(self):
    		# Appel de l'init dont B hérite (donc l'init de "A")
    		super(B, self).__init__()
    		# Ici B contient les attributs publics de "A"
     
    		# Les attributs de B
    		self.attribB=456
    	# __init__()
    # class B
     
    varA=A()
    # varA est un objet A: on ne peut accéder qu'aux attributs publics de A
    print("varA contient", varA.attribA)
     
    varB=B()
    # varB est un objet B qui hérite de A donc de ses attributs publics, plus bien évidemment ses propres attributs
    print("varB contient", varB.attribA)
    print("varB contient", varB.attribB)

    A partir de là, tu peux donc créer dans une syntaxe analogue ton propre composant qui hérite de checkbutton. Attention, l'héritage multiple (X qui hérite de Y et Z) existe en Python mais je ne sais pas si tkinter l'accepte (je ne connais pas cette librairie). Mais Qt (une autre librairie permettant aussi de programmer des IHM et que je connais) ne le permet pas.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Merci Seve@r. Il n'y a bel et bien rien dans mes posts qui le mentionne, et, en effet, je n'y ai pas encore touché, mais je l'avais déjà vu dans la doc. Je reconnais qu'il y a loin de la lecture dans la doc à l'écriture dans un programme, mais c'est comme ça qu'on avance (en tout cas, que j'avance).

    Pour fixer les idées pour wiztricks, les langages de programmation que j'ai utilisés du temps de ma vie professionnelle se comptent en dizaines, aussi bien en assembleur sur petit calculateur propriétaire embarqué que sur mainframe (là, de l'assembleur aux langage de très haut niveau comme APL), pour des applications embarquées, ou de gestion, ou de CAO. Par contre, j'ai quitté ce monde avant l'arrivée de la POO.

    AMIcalement.

  20. #20
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J’apprécie beaucoup le tuto de Gérard Swinnen, mais un tuto ne suffit pas: il faut aussi une documentation de référence sur tout ce qui est disponible. Ces 2 documents, tuto et référentiel, sont complémentaires.

    Au cas où, il y en a une documentation de référence ici pour tkinter:

    https://infohost.nmt.edu/tcc/help/pu...er/tkinter.pdf

Discussions similaires

  1. [prototype] gérer les événements dans une classe
    Par nawac dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/05/2010, 18h44
  2. Intercepter un événement dans une classe
    Par al_bert dans le forum C#
    Réponses: 3
    Dernier message: 03/03/2010, 16h45
  3. Ajout d'un évènement dans une classe
    Par marcaille dans le forum C#
    Réponses: 6
    Dernier message: 23/10/2009, 19h38
  4. Définir des événements dans une classe
    Par Masmeta dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/04/2008, 17h41

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