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 :

IGUI avec notion de class [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2021
    Messages : 10
    Points : 7
    Points
    7
    Par défaut IGUI avec notion de class
    Bonjour,

    Mon niveau en python n'est trop loin de celui d'un débutant.
    D'habitude, je fais les IHM en utilisant les objets les uns après les autres sans classe.

    Pour apprendre la bonne pratique, je passe donc à la notion de classe. Cependant, j'ai un souci énoncé ci-dessous et voudrais demander aux bonnes volonté un coup de pouce. Merci d'avance.

    J'utilise une classe App pour écrire mon code d'IHM.
    Le problème c'est qu'à l'intérieur de mon init j'ai mis self, master. Et dans le main j'appelle TK dans root puis je fais app=App(root).
    Mon IHM marche mais j'aimerais comprendre le bon emplacement de master et root voir même la philosophie de cette de class.
    Vous trouverez plus de détails dans le code suivant:

    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
     
     
    import tkinter as tk
    from tkinter import *
     
    class App(object):
     
         def __init__(self, master) :
             master.title('Test of test')
             master.geometry('500x500')
     
             frame1 = Frame(master, bg = 'yellow', padx=20, pady=20)
             frame1.grid(row=1, column=1)        
             Label(frame1, text='Name', padx=50, pady=50).pack()
             Label(frame1, text='Email', padx=5, pady=5).pack()
     
     
    if __name__ == '__main__':
            root= tk.Tk()
            app = App(root)                                        
            root.mainloop()

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

    Citation Envoyé par Zaverti Voir le message
    Mon IHM marche mais j'aimerais comprendre le bon emplacement de master et root voir même la philosophie de cette de class.
    Sans "class", on pourrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tkinter as tk
     
     
    root= tk.Tk()
    root.title('Test of test')
    root.geometry('500x500')
    frame1 = tk.Frame(root, bg = 'yellow', padx=20, pady=20)
    frame1.grid(row=1, column=1)        
    tk.Label(frame1, text='Name', padx=50, pady=50).pack()
    tk.Label(frame1, text='Email', padx=5, pady=5).pack()
    root.mainloop()
    Après on peut jouer avec les "class" pour ranger les instructions dans des boîtes... mais à vous d'expliquer pourquoi vous avez choisi les boîtes et justifier pourquoi telle instruction doit être rangée là plutôt qu'ailleurs.

    Ce que je veux dire par là, c'est que la "philosophie" c'est à vous de la définir...

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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2021
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci de votre intervention.

    En fait j'utilise Class pour des raisons de structuration, modularité, de maintenabilité, de portabilité, enfin de bonne pratique.

    J'ai plusieurs lignes de code; donc quand je mets la partie dIHM dans une classe et ça semble mieux pour ne pas me répéter.

    Oui mais je fais le code sans comprendre le fond de l'histoire de master, root, etc.

    Puis-je par exemple mettre root.title à la place master.title et master.geometry ?

  4. #4
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    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 : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Zaverti Voir le message

    Puis-je par exemple mettre root.title à la place master.title et master.geometry ?
    Si je t'ai bien compris, ton 'trouble' porte sur le fait que dans ta classe il est question de master, et dans le corps du programme qui l'appelle de root. Si c'est bien le cas, tu n'as pas encore assimilé les notions relatives aux arguments et donc tu n'es pas prêt à utiliser une classe et tkinter: Car avant de vouloir utiliser des classes (ou tkinter) il te faut maîtriser les bases de python que seule l'étude active d'un tutoriel peut t'apporter.
    On construit une maison en commençant par les fondations et non par le toit.
    Si je ne t'ai pas compris alors précise l'objet de ta question ... (à moins que je sois le seul à ne pas avoir saisi l'objet de ta question. .. )
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Zaverti Voir le message
    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
     
     
    import tkinter as tk
    from tkinter import *
     
    class App(object):
     
         def __init__(self, master) :
             master.title('Test of test')
             master.geometry('500x500')
     
             frame1 = Frame(master, bg = 'yellow', padx=20, pady=20)
             frame1.grid(row=1, column=1)        
             Label(frame1, text='Name', padx=50, pady=50).pack()
             Label(frame1, text='Email', padx=5, pady=5).pack()
     
     
    if __name__ == '__main__':
            root= tk.Tk()
            app = App(root)                                        
            root.mainloop()
    Un autre possibilité est d'hériter de Tk, ou éventuellement te Frame si tu veux créer un widget.

    Donc, au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import tkinter as tk
    # -tc- pas besoin du second import avec l'étoile. Prends l'habitude de ne jamais utiliser l'étoile
     
    # -tc- Prends également l'habitude de ne pas hériter de object, plus nécessaire en python 3 et python 2 est mort. La pratique est aujourd'hui découragée.
    class App:
        ...
    Tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import tk
     
    class App(tk.Tk):
     
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # suite de ton code
    Maintenant, self est ton master et il suffit d'instancier App et d'appeler mainloop dessus pour démarrer l'application.

    De manière générale, tu peux également utiliser cette technique pour créer de nouveaux widgets (en héritant par exemple de tk.Frame ou en héritant du widget que tu veux spécialiser. Les IHM, comme les jeux, sont un excellent territoire pour bosser les notions d'objet comme la composition ou ici l'héritage.
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Citation Envoyé par Zaverti Voir le message
    Oui mais je fais le code sans comprendre le fond de l'histoire de master, root, etc.
    root et master sont des "concepts" liés à tkinter...
    Pour programmer avec tkinter, il faut commencer par ouvrir un tuto. et lire la documentation Python.

    Citation Envoyé par Zaverti Voir le message
    Puis-je par exemple mettre root.title à la place master.title et master.geometry ?
    root étant une variable globale, vous pouvez... et si vous essayez, constater que ça va fonctionner "pareil". Après côté nom des variables, root, master, X, Y, Z,... ce peuvent être des "repères" parce qu'on comprend les concepts qui se cachent derrière et comment s'utilisent les objets associés.... mais ça reste des chaine de caractères: X ou root, c'est pareil.

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

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Et de manière générale, dans la lignée du message plus haut, programmer objet pour tkinter n'a rien de spécifique à tkinter. Ne pas hésitez de revoir les concepts du python objet pour être certains de bien comprendre ce que tu manipules et quand.
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2021
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Pour les 2 imports, c'est juste une erreur. Oui j'utilise pas le * en dehors d'un petit code de test.
    D'accord c'est noté. Merci beaucoup pour votre aide.

    Citation Envoyé par wiztricks Voir le message
    Merci pour ces lien intéressant; ça me sera utile.

    Citation Envoyé par Hominidé Voir le message
    Oui justement vous avez compris mon souci.
    Je programmais sans comprendre la théorie.

    Merci bien. Je pense avoir eu assez de ressources pour me débrouiller.

    Citation Envoyé par Thierry Chappuis Voir le message
    J'ignorais c'est le concept de l'orienté objet qui fonctionnait là.
    Merci.

  9. #9
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    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 : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Citation Envoyé par Zaverti Voir le message
    Oui justement vous avez compris mon souci.
    Je programmais sans comprendre la théorie.

    Merci bien. Je pense avoir eu assez de ressources pour me débrouiller.
    Pour info, il y a un mooc pour apprendre python mis à disposition gracieusement par la plateforme fun-mooc. https://www.fun-mooc.fr/fr/cours/pyt...es-du-langage/
    Testé et approuvé!
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

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

Discussions similaires

  1. [CS4] jeu Snake avec notion des classes
    Par amineprog dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 29/12/2010, 14h00
  2. un cas avec des Sous Classes
    Par Daeron dans le forum Langage
    Réponses: 7
    Dernier message: 17/01/2006, 17h39
  3. Notions de classe abstraite
    Par smag dans le forum C++
    Réponses: 11
    Dernier message: 12/06/2005, 02h04
  4. Réponses: 5
    Dernier message: 02/09/2004, 16h17

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