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 :

mainloop que je ne comprends pas [Python 2.X]


Sujet :

Python

Vue hybride

Thierry_V mainloop que je ne comprends... 11/08/2014, 21h38
wiztricks Salut, Vous avez un... 11/08/2014, 22h28
Thierry_V Oui effectivement avec la... 12/08/2014, 22h12
Invité Bonjour, Attention à photo... 11/08/2014, 22h57
Thierry_V Bonjour merci pour toutes... 12/08/2014, 19h30
Invité Faites un saut ici :... 12/08/2014, 19h48
Thierry_V Donc la class est une... 12/08/2014, 20h36
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut mainloop que je ne comprends pas
    Bonjour,

    Chose que je ne comprends pas, je suis obligé de placer un mainloop alors que c'est pas normal. D'ailleurs en 64 bits ça marche mais pas en 32 bits

    merci

    voici le 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    def Securite_info_sys():
     
        import os, sys
        global TxtSecurite2, TxtSecurite, v, Win_malwares
     
        Win_malwares = Canvas(Win_origine , height=512, width=512)
        Win_malwares.pack(side=TOP, fill=BOTH, expand=1)
        TxtSecurite = Text(Win_malwares, height=20, width=30)
     
        TxtSecurite.tag_configure('bold_italics',
                            font=('Arial', 12, 'bold', 'italic'))
        TxtSecurite.tag_configure('big',
                            font=('Verdana', 14, 'bold'))
        TxtSecurite.tag_configure('color', foreground='#476042',
                            font=('Tempus Sans ITC', 12, 'bold'))
        TxtSecurite.tag_bind('follow', '<1>', lambda e, t=TxtSecurite: t.insert(END, "Pas maintenant, peut-être plus tard!"))
     
        TxtSecurite.insert(END,'\nAnalyse Registre\n', 'big')
     
        photo=PhotoImage(file='RegWin.gif')
        TxtSecurite.insert(END,'\n')
        TxtSecurite.image_create(END, image=photo)
     
     
     
        v = IntVar()
        Label(Win_malwares, 
              text="""GUW - GUIDE UTILE WINDOWS""",
              justify = LEFT,
              padx = 20).pack()
     
        Radiobutton(Win_malwares, 
                    text="Analyse Protection (liste des logiciels de protection)",
                    padx = 20, 
                    variable=v,
                    command=mchoix,
                    value=1).pack(anchor=W)
        Radiobutton(Win_malwares, 
                    text="Analyse Malwares (pas de désinfection, seulement préventif)",
                    padx = 20, 
                    variable=v,
                    command=mchoix,
                    value=2).pack(anchor=W)
        Radiobutton(Win_malwares, 
                    text="Analyse Conseils (logiciels à éviter ou pas utiles)",
                    padx = 20, 
                    variable=v,
                    command=mchoix,
                    value=3).pack(anchor=W)
        Radiobutton(Win_malwares, 
                    text="Retour Menu Général",
                    padx = 20, 
                    variable=v,
                    command=mchoix,
                    value=4).pack(anchor=W)
        TxtSecurite.pack(side=LEFT)
     
     
     
        TxtSecurite2 = Text(Win_malwares, height=20, width=75)
        scroll = Scrollbar(Win_malwares, command=TxtSecurite2.yview)
        TxtSecurite2.configure(yscrollcommand=scroll.set)    
     
     
        TxtSecurite2.pack(side=LEFT)
        scroll.pack(side=RIGHT, fill=Y)
     
        Win_malwares.mainloop()    <------------ je ne devrais pas mettre le mainloop puisqu'il corresponds à un canvas, si je ne fais pas cela pas d'affichage d'image et pas de traitement (cela en 32 bits)
                                                                le pire est que je n'ai pas de message d'erreur en IDLE, ???

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

    Vous avez un premier problème ici:
    photo=PhotoImage(file='RegWin.gif')
    TxtSecurite.insert(END,'\n')
    TxtSecurite.image_create(END, image=photo)
    A la sortie du callback? Securite_info_sys, photo n'existe plus et l'image ne sera plus affichée.
    L'appel a .mainloop évite la sortie du callback: on voit l'image.

    Ajoutez juste "photo" comme variable globale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def Securite_info_sys():
     
        import os, sys
        global TxtSecurite2, TxtSecurite, v, Win_malwares, photo
        ...
    Et racontez ce qu'il se passe.

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

  3. #3
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut
    Oui effectivement avec la déclaration globale pour la variable photo, je garde bien l'image
    merci

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Vous avez un premier problème ici:

    A la sortie du callback? Securite_info_sys, photo n'existe plus et l'image ne sera plus affichée.
    L'appel a .mainloop évite la sortie du callback: on voit l'image.

    Ajoutez juste "photo" comme variable globale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def Securite_info_sys():
     
        import os, sys
        global TxtSecurite2, TxtSecurite, v, Win_malwares, photo
        ...
    Et racontez ce qu'il se passe.

    - W

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Attention à photo qui est une locale : vous allez perdre la référence à votre image en fin d'appel de fonction. Mettez global photo en début de fonction.

    La boucle événementielle principale mainloop() peut s'appeler de n'importe quel widget.

    Voir la doc officielle à ce sujet : http://infohost.nmt.edu/tcc/help/pub...universal.html

    w.mainloop()
    This method must be called, generally after all the static widgets are created, to start processing events. You can leave the main loop with the .quit() method (below). You can also call this method inside an event handler to resume the main loop.
    Si vous devez appeler la boucle mainloop() dans ce contexte, c'est qu'elle n'est pas appelée par ailleurs. Il faut donc tracer pourquoi mainloop() n'est pas appelée avec la fenêtre Tk() avant de passer par votre fonction.

    Quoiqu'il en soit, votre bout de code n'est pas assez étendu pour voir où se cache le problème.

    Quid de la définition de la fenêtre Tk() ? Quid de l'endroit d'où on appelle votre fonction ? Etc, etc.

    Et puis cette manie de coller un objet Text() dans un objet Canvas(). Fichtre ! Quel mystère ! D'où ça vous vient, ça ?

    Un canevas est un écran graphique (pour dessiner dessus), ce n'est pas un conteneur à widgets.

    Si vous voulez un conteneur à widgets, prenez Frame(), il est conçu pour ça. http://infohost.nmt.edu/tcc/help/pub...web/frame.html (lisez la première ligne d'explication)

    11. The Frame widget

    A frame is basically just a container for other widgets.
    Apprenez aussi à travailler avec le principe du composant logiciel : votre appli fait appel à plusieurs écrans => chaque écran est un "composant", une brique de votre appli, vous devriez donc l'écrire sous forme de classe puisque c'est une structure à part entière.

    Exemple :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from __future__ import unicode_literals
     
    from Tkinter import *
     
    class Composant (Frame):
        """
            en général, on met une classe de composant dans un fichier
            éponyme séparé e.g. supposons que vous appeliez cette classe
            composant 'GUWProtection', vous créeriez alors un fichier
            guw_protection.py dans lequel vous mettriez cette classe :
            class GUWProtection (Frame):
                ...etc...
        """
     
        def __init__ (self, master=None, **kw):
            # super class inits
            Frame.__init__(self, master, **kw)
            # contents inits
            self.init_widget()
        # end def
     
        def init_widget (self):
            """
                mettez ici tous les widgets concernés par ce composant
                logiciel en particulier;
            """
            # titre
            Label(
                self,
                text="Ceci est un titre",
                font="sans 16 bold",
                bg="white",
            ).grid(row=0, column=0, ipadx=10, sticky=NW+SE)
            # illustration
            self.photo = PhotoImage(file="conseiller-guw.gif")
            Label(
                self,
                image=self.photo,
                bg="white"
            ).grid(row=1, column=0, ipady=5, sticky=NW+SE)
            # autre contenu
            frame = Frame(self, bg="sky blue", width=300, height=200)
            frame.grid(row=0, column=1, rowspan=2, sticky=NW+SE)
            # pour conserver les dims du frame
            frame.pack_propagate(0)
            # etc, etc...
            Label(
                frame,
                bg=frame["bg"],
                text="Mettez ici\ntous les widgets\nque vous voulez",
            ).pack(expand=1, fill=X, padx=10)
        # end def
     
    # end class Composant
     
     
    # appli principale
     
    fenetre = Tk()
     
    # on met le composant dans notre fenêtre
     
    mon_composant = Composant(fenetre)
     
    mon_composant.pack(expand=1, fill=BOTH)
     
    # bouton quitter
     
    Button(
        fenetre,
        text="Quitter",
        command=fenetre.destroy,
    ).pack(side=RIGHT, padx=5, pady=5)
     
    # boucle événementielle principale
     
    fenetre.mainloop()
    Essayez aussi de respecter les conventions de nommage SVP, votre code est difficilement déchiffrable dans la configuration actuelle des noms de variables, fonctions, etc.

    PEP 8 conventions de nommage : http://legacy.python.org/dev/peps/pe...ng-conventions

    @+.

  5. #5
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut
    Bonjour

    merci pour toutes ces observations.
    je fait les modif.

    Il y a deux mois lorsque j'ai débuté avec python, je me suis référencé aux exemples du net et sans explications la tâche n'est pas simple.
    Ici au moins on explique

    Là ou j'ai du mal à comprendre ce sont les class

    donc mon menu dans une class qui va comprendre des fonctions et faire appel à divers autres sous programmes ( en gros c'est le principe ou pas)
    La programmation objet je l'a découvre que depuis deux mois, c'est un schéma ou organigramme de principe qu'il me faudrait, et cela pas vu sur le Net et ensuite je pourrais établir un programme sans avoir ce type d'erreur comme l'objet text() dans un canvas .

    merci à vous

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Thierry_V Voir le message
    Bonjour
    Là ou j'ai du mal à comprendre ce sont les class
    Faites un saut ici : http://fr.wikibooks.org/wiki/Apprend...ets,_attributs

    Et là : http://fr.wikibooks.org/wiki/Apprend..._de_graphismes

    Ça pourrait servir.

    @+.

  7. #7
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut
    Donc la class est une fonction qui retourne ou pas une valeur ou les variables sont attachées à celle ci et ne peuvent être gérée par une autre class ou fonction.
    Alors que la fonction peut être tributaire d'une variable de même nom dans une fonction et ainsi interféré sur le résultat de la 1 fonction.
    Alors il n'y a pas d'obligation de class sauf si on veux se créer une librairie propre sans se soucier de la nomination des variables doublons.
    Si on veux une variable globale on utilise une fonction, si la déclaration est faite dans la fonction, et si on quitte cette fonction la variable globale est perdue ou pas ?
    sinon la déclaration doit se réaliser dans le corps principale du soft pour la rendre accessible à toutes les fonctions mais les class ?

    voilà ma réflexion ,est-ce correcte ou pas ?
    merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Thierry_V Voir le message
    Donc la class est une fonction qui retourne ou pas une valeur ou les variables sont attachées à celle ci et ne peuvent être gérée par une autre class ou fonction.
    Alors que la fonction peut être tributaire d'une variable de même nom dans une fonction et ainsi interféré sur le résultat de la 1 fonction.
    Alors il n'y a pas d'obligation de class sauf si on veux se créer une librairie propre sans se soucier de la nomination des variables doublons.
    Si on veux une variable globale on utilise une fonction, si la déclaration est faite dans la fonction, et si on quitte cette fonction la variable globale est perdue ou pas ?
    sinon la déclaration doit se réaliser dans le corps principale du soft pour la rendre accessible à toutes les fonctions mais les class ?

    voilà ma réflexion ,est-ce correcte ou pas ?
    merci
    Waw.

    Je crois qu'il n'y a pas qu'avec les classes que vous avez des difficultés.

    Reprenons depuis le début, voulez-vous ?

    Essayez de répondre honnêtement aux questions suivantes, comme vous les comprenez vous (et non pas un copié/collé de wikipedia ou autre) :

    Qu'est-ce qu'une variable ?

    Votre réponse :

    Qu'est-ce qu'une fonction ?

    Votre réponse :

    Qu'est-ce que la visibilité d'une variable ?

    Votre réponse :

    Qu'est-ce qu'une globale ?

    Votre réponse :

    Qu'est-ce qu'une locale ?

    Votre réponse :

    Je pense que vous avez besoin d'éclaircir ces notions de base dans votre esprit.

    @+.

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

Discussions similaires

  1. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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