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 :

Débutant sur tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Par défaut Débutant sur tkinter
    Bonjour à tous, voilà un petit bout de programme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from Tkinter import *
    root = {0: Tk()}
     
    root[1] = Button(root[0], text='OOO\nOOO')
    root[1].pack(side=LEFT)
     
    root[0].title('PACK')
    root[0].protocol('WM_DELETE_WINDOW', root[0].quit)
    root[0].mainloop()
    root[0].destroy()
    Mais j'ai du mal à comprendre la deuxième ligne :

    Notre prof nous a parlé de dictionnaire, de widget mère mais j'ai du mal à bien saisir ce que ça représente.
    Ensuite de je comprend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root[0].protocol('WM_DELETE_WINDOW', root[0].quit)
    A quoi correspond ce protocole ?

    Et pourquoi a-t-on besoin de la commande :

    Car la fenêtre se crée au fil des lignes de commandes ?

    Voilà, comme vous l'aurez sans doute remarqué je suis complètement novice sur le sujet...
    J'espère que vous pourrez m'aider.

    Emma.

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonjour,
    la ligne
    root = {0: Tk()}
    cree le dictionnaire root et y met une instance Tk c est a dire une fenetre si on veut. Pour chaque interface graphique Tkinter, il faut une instance Tk qui en fait la fenetre principale, meme si on ne la declare pas toujours explicitement.
    Dans ton dictionnaire 'root', tu peux a acceder a la fenetre principale comme a un element de tableau, vu que sa cle est 1. Mais tu peux egalement utiliser d autres elements comme cle, pourvu qu ils ne puissent pas changer au fil du temps.

    la ligne
    root[0].protocol('WM_DELETE_WINDOW', root[0].quit)
    Fait savoir signale a Tkinter que lorsque l on cliquera sur le boutton ferme 'X', il devra lancer la methode 'quit' de ta fenetre principale.

    la ligne
    root[0].mainloop()
    est en fait semblable a une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while 1:
        recuperer les evenments
        faire les actions demandees
        actualiser la fenetre et ses enfants
    @+ et bons debuts avec Python
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Par contre si ton prof explique (ou si quelqu'un a l'explication) pourquoi il mets l'instance et les Widgets dans un dictionnaire (root = {0: Tk()}) je suis preneur : Ce n'est pas le premier code du même style que je vois sur le forum et je n'en comprend pas l'utilité.

    De même pourquoi le root[0].destroy() après le mainloop() ?

    Bonne découverte et merci si tu as des réponses.

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Je vais juste me permettre de développer.

    Citation Envoyé par adise Voir le message
    Mais j'ai du mal à comprendre la deuxième ligne :

    Notre prof nous a parlé de dictionnaire, de widget mère mais j'ai du mal à bien saisir ce que ça représente.
    Le dictionnaire root est créé avec pour valeur une instance Tk ayant pour clé 0.
    Lorsque tu utilise root[0] le dico te retourne l'instance stockée ayant pour clé 0.
    Pourquoi instance ? Lorsque tu fais Tk() tu initialise la classe Tk de Tkinter (ce qui crée une fenêtre), on appelle cela une instance.
    Dans cette logique avec
    root[1] = Button(root[0], text='OOO\nOOO')
    On rajoute au dico root une clé 1 qui a pour valeur un Widget (Objet) Tkinter Button.
    A remarquer le Button(root[0],...
    C'est sans doute ce qui est appeler widget mère, moi j'appelle cela le parent. Cela signifie que le Widget Button doit être créer dans la fenêtre qui correspond à root[0].
    Cela permet au gestionnaire de géométrie pack (root[1].pack(side=LEFT)) de savoir ou mettre le bouton. A noter qu'en l'absence d'information sur le parent le gestionnaire de géométrie (il en existe 3 : pack, grid et place) placeras le Widget dans l'instance Tk (qui doit être unique).

    Citation Envoyé par adise Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root[0].protocol('WM_DELETE_WINDOW', root[0].quit)
    protocol permet une interaction avec le gestionnaire de fenêtre.
    Il permet d'intercepter les évènements. Par exemple WM_TAKE_FOCUS correspond au fait que l'objet obtient le focus à l'écran.
    WM_DELETE_WINDOW correspond à la fermeture de la fenêtre.
    Habituellement le protocol WM_DELETE_WINDOW est utilisé pour intercepter la fermeture de la fenêtre afin d'accomplir une action, par exemple vérifier qu'un traitement est fini ou sauvegarder un fichier. C'est habituellement bloquent.
    Regarde 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
    from Tkinter import *
     
    def etnon():
        print 'et non'
     
    root = {0: Tk()}
     
    root[1] = Button(root[0], text='OOO\nOOO')
    root[1].pack(side=LEFT)
    root[2] = Button(root[0], text='Quit', command=root[0].quit)
    root[2].pack(side=LEFT)
     
    root[0].title('PACK')
    root[0].protocol('WM_DELETE_WINDOW', etnon)
    root[0].mainloop()
    root[0].destroy()
    Ici le protocol WM_DELETE_WINDOW appelle la fonction etnon (def etnon())qui affiche un 'et non' dans la console mais ne ferme pas la fenêtre.
    Note: J'ai rajouter un Button (root[2]) pour te permettre de sortir du piège (command=root[0].quit)
    Sous Tkinter tu dispose de deux possibilités d'interagir avec les évènements.
    protocol pour ce qui est du gestionnaire de fenêtre (Windows, X11 sous Linux etc...)
    bind pour les évènements sur les Widgets Tkinter.
    Si tu souhaite aller plus loin voici un petit code a méditer (sinon passe à la suite )
    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
    from Tkinter import *
     
    def ondestroy(event):
        print "Destruction de", event.widget
     
    def ondelete():
        print "Deletion de root"
        try:
            root[0].destroy()
        except:
            pass
     
    root = {0: Tk()}
     
    root[0].bind("<Destroy>", ondestroy)
    root[0].protocol("WM_DELETE_WINDOW", ondelete)
     
    root[1] = Button(root[0], text="Destroy", command=root[0].destroy)
    root[1].pack()
     
    root[0].mainloop()
    Pour ce qui est du mainloop() et comme le dit afranck64 cela active la gestion des évènements. Attention c'est une boucle donc bloquant: Les instructions suivantes ne seront lut qu'après la fermeture de la fenêtre.

    Pour mes questions précédentes (pourquoi le destroy et le dico ?):
    Soit le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from Tkinter import *
    root = {0: Tk()}
     
    root[1] = Button(root[0], text='OOO\nOOO')
    root[1].pack(side=LEFT)
     
    root[0].title('PACK')
    root[0].protocol('WM_DELETE_WINDOW', root[0].quit)
    root[0].mainloop()
    root[0].destroy()
    print root
    et sa sortie console
    {0: <Tkinter.Tk instance at 0xb77c9a0c>, 1: <Tkinter.Button instance at 0xb77cc1ac>}
    Pourquoi garder une référence dans un dico ?
    De même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from Tkinter import *
    root = {0: Tk()}
     
    root[1] = Button(root[0], text='OOO\nOOO')
    root[1].pack(side=LEFT)
     
    root[0].title('PACK')
    root[0].protocol('WM_DELETE_WINDOW', root[0].destroy)
    root[0].mainloop()
    Cela n'est il pas plus simple ?
    Mais bon, il doit sans doute y avoir une portée pédagogique que la distance qui me sépare de mes études ne me permet pas de voir.

    Bienvenue.

Discussions similaires

  1. Débutant cherche explications sur Tkinter
    Par Khar14 dans le forum Général Python
    Réponses: 3
    Dernier message: 23/09/2014, 12h37
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50
  4. [Kylix] Re Re: débutant sur Kylix et Linux.....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/06/2002, 22h53
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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