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 :

Page d'accueil envoyant vers divers tutos


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut Page d'accueil envoyant vers divers tutos
    Bonjour,

    Je souhaite regrouper en un seul programme de nombreux petits programmes courts et indépendants les uns des autres, notamment des petits tutos sur l'utilisation de widgets.

    Une page d'accueil donnerait accès à chacun de ces programmes

    Le code ci-dessous fonctionne mais il y a certainement mieux à faire.

    Pouvez-vous le critiquer en m'indiquant des défauts et me suggérant des améliorations.

    Merci d'avance.

    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
     
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    from tkinter import *
    from tkinter import messagebox
     
    class Activite1:
        def __init__(self, parent):
     
            self.parent=parent
     
     
            self.moncadre = Frame(parent,bg="beige")
            self.moncadre.place(width=480,height= 280,relx=0.02,rely=0.02)
     
            Label(self.moncadre,text="Ici se déroulerait l'activite 1", bg="lightblue").place(relx = 0.3, rely = 0.3)
     
            self.BoutonQuitter = Button(self.moncadre, command=self.quitter)
            self.BoutonQuitter.configure(text="Retour à l'accueil", background= "lightgreen")
            self.BoutonQuitter.place(relx=0.30,rely=0.7)
     
        def quitter(self):
     
            self.parent.title("Diverses activités")
            self.moncadre.destroy()
     
    class Activite2:
        def __init__(self, parent):
     
            self.parent=parent
     
     
            self.moncadre = Frame(parent,bg="beige")
            self.moncadre.place(width=480,height= 280,relx=0.02,rely=0.02)
     
            Label(self.moncadre,text="Ici se déroulerait l'activite 2", bg="lightblue").place(relx = 0.3, rely = 0.3)
     
            self.BoutonQuitter = Button(self.moncadre, command=self.quitter)
            self.BoutonQuitter.configure(text="Retour à l'accueil", background= "lightgreen")
            self.BoutonQuitter.place(relx=0.30,rely=0.7)
     
        def quitter(self):
     
            self.parent.title("Diverses activités")
            self.moncadre.destroy()
     
    def activite1():
     
        fenetre.title("Activite 1")
     
        act = Activite1(fenetre)   
     
    def activite2():
     
       fenetre.title("Activite 2")
     
       act = Activite2(fenetre) 
     
    ###################  Page d'accueil   #######################
     
    fenetre=Tk()
    fenetre.geometry("600x400")
    fenetre.title("Compilation de tutoriels")
    fenetre.configure(bg = "lightblue")
     
    activite1 = Button(fenetre,text="Lancement de l'activité 1", bg = "lightgreen",padx=7,pady=7,command = activite1)
    activite1.place(relx=0.3,rely=0.1)
     
    activite2 = Button(fenetre,text="Lancement de l'activité 2", bg = "lightgreen",padx=7,pady=7,command = activite2)
    activite2.place(relx=0.3,rely=0.3)
     
    fenetre.mainloop()

  2. #2
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut Une amélioration
    par rapport à ma version ci-dessus, dès les boutons de la page d'accueil j'appelle directement la classe.

    Le Frame dans chaque classe cache et donc rend inaccessible les widgets sous-jacents de la page d'accueil.

    Améliorations prévues : adapter la taille des frames aux dimensions de la fenêtre, mais j'attends de prendre en compte vos critiques et suggestions éventuelles.

    Dans un cas comme celui-là est-ce la peine d'utiliser des Toplevel?

    A bientôt de vous lire



    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from tkinter import *
    from tkinter import messagebox
     
    class Activite1:
        def __init__(self, parent):
     
            self.parent=parent
            self.parent.title("Activite 1")
     
            self.moncadre = Frame(parent,bg="beige")
            self.moncadre.place(width=480,height= 280,relx=0.02,rely=0.02)
     
            Label(self.moncadre,text="Ici se déroulerait l'activite 1", bg="lightblue").place(relx = 0.3, rely = 0.3)
     
            self.BoutonQuitter = Button(self.moncadre, command=self.quitter)
            self.BoutonQuitter.configure(text="Retour à l'accueil", background= "lightgreen")
            self.BoutonQuitter.place(relx=0.30,rely=0.7)
     
        def quitter(self):
     
            self.parent.title("Diverses activités")
            self.moncadre.destroy()
     
    class Activite2:
        def __init__(self, parent):
     
            self.parent=parent
            self.parent.title("Activite 2")
     
            self.moncadre = Frame(parent,bg="beige")
            self.moncadre.place(width=480,height= 280,relx=0.02,rely=0.02)
     
            Label(self.moncadre,text="Ici se déroulerait l'activite 2", bg="lightblue").place(relx = 0.3, rely = 0.3)
     
            self.BoutonQuitter = Button(self.moncadre, command=self.quitter)
            self.BoutonQuitter.configure(text="Retour à l'accueil", background= "lightgreen")
            self.BoutonQuitter.place(relx=0.30,rely=0.7)
     
        def quitter(self):
     
            self.parent.title("Diverses activités")
            self.moncadre.destroy()
     
     
    ###################  Page d'accueil   #######################
     
    fenetre=Tk()
    fenetre.geometry("600x400")
    fenetre.title("Compilation de tutoriels")
    fenetre.configure(bg = "lightblue")
     
    activite1 = Button(fenetre,text="Lancement de l'activité 1", bg = "lightgreen",padx=7,pady=7,command = lambda: Activite1(fenetre))
    activite1.place(relx=0.3,rely=0.1)
     
    activite2 = Button(fenetre,text="Lancement de l'activité 2", bg = "lightgreen",padx=7,pady=7,command = lambda: Activite2(fenetre))
    activite2.place(relx=0.3,rely=0.3)
     
    fenetre.mainloop()

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut Avec des Toplevel
    En utilisant tous les conseils qui m'ont été donnés récemment et en exploitant les liens indiqués voici une version qui reste certainement perfectible.

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    from tkinter import *
    from tkinter import messagebox
     
     
    class Activite1(Toplevel):
     
        # fenêtre satellite
     
        def __init__(self,couleur="beige"):
     
            Toplevel.__init__(self)
            self.geometry("600x400")   
            self.overrideredirect(0)            # => si paramètre 1 fenêtre sans bordure ni bandeau
            self.transient(self.master)         # => fenêtre 'modale'
            self.configure(bg=couleur)
            self.title("Activité 1")
     
            self.protocol("WM_DELETE_WINDOW", self.vraimentfermer)  # procédure de contrôle de fermeture par clic sur la croix en haut à droite
     
            self.grab_set()      # rend actif les evenements souris ou clavier seulement sur cette fenetre
     
            Label(self,text="Ici se déroulerait l'activite 1", bg="lightblue",font="Arial 12",padx=10,pady=10).place(relx = 0.3, rely = 0.3)
     
            self.boutonpop=Button(self,text="Cliquez ici ou Appuyez sur q ou Return pour fermer", command=self.destroy,bg="lightgreen",name="boutonpop")
            self.boutonpop.place(width=380,height=30,relx=0.2,rely=0.6)
            self.boutonpop.focus_set()
     
            self.boutonpop.bind('<KeyPress>', self.on_key)
     
        def on_key(self,event):
     
     
            if (event.keysym is "q" or event.keycode is 104 or event.keycode is 36) :   # 104 code de return sur pave numerique
     
     
               self.destroy()    # effacement de la fenêtre satellite    
     
        def vraimentfermer(self):    # envoi ici lors d'un essai de fermeture par la croix de la fenêtre
     
            if messagebox.askokcancel("Quitter", "Voulez-vous vraiment quitter ?"):
                self.destroy()
     
     
    class Activite2(Toplevel):
     
        def __init__(self,couleur="beige"):
     
            Toplevel.__init__(self)
            self.geometry("600x400")
            self.overrideredirect(0)            # => si paramètre 1 fenêtre sans bordure ni bandeau
            self.transient(self.master)         # => fenêtre 'modale'
            self.configure(bg=couleur)
            self.title("Activité 2")
     
            self.protocol("WM_DELETE_WINDOW", self.vraimentfermer)  # procédure de contrôle de fermeture par clic sur la croix en haut à droite
     
            self.grab_set()      # rend actif les evenements souris ou clavier seulement sur cette fenetre
     
            Label(self,text="Ici se déroulerait l'activite 2", bg="lightblue",font="Arial 12",padx=10,pady=10).place(relx = 0.3, rely = 0.3)
     
            self.boutonpop=Button(self,text="Cliquez ici ou Appuyez sur q ou Return pour fermer", command=self.destroy,bg="lightgreen",name="boutonpop")
            self.boutonpop.place(width=380,height=30,relx=0.2,rely=0.6)
            self.boutonpop.focus_set()
     
            self.boutonpop.bind('<KeyPress>', self.on_key)
     
        def on_key(self,event):
     
            if (event.keysym is "q" or event.keycode is 104 or event.keycode is 36) :   # 104 code de return sur pave numerique
     
                print((event.widget) == ".boutonpop")
     
                self.destroy()    # effacement de la fenêtre satellite    
     
        def vraimentfermer(self):    # envoi ici lors d'un essai de fermeture par la croix de la fenêtre
     
            if messagebox.askokcancel("Quitter", "Voulez-vous vraiment quitter ?"):
                self.destroy()
     
     
     
    ###################  Page d'accueil   #######################
     
     
     
    fenetre=Tk()
    fenetre.geometry("600x400")
    fenetre.title("Compilation de tutoriels")
    fenetre.configure(bg = "lightblue")
     
    activite1 = Button(fenetre,text="Lancement de l'activité 1", bg = "lightgreen",padx=7,pady=7,command = Activite1)
    activite1.place(relx=0.3,rely=0.1)
     
    activite2 = Button(fenetre,text="Lancement de l'activité 2", bg = "lightgreen",padx=7,pady=7,command = lambda: Activite2("pink"))
    activite2.place(relx=0.3,rely=0.3)
     
    fenetre.mainloop()

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

    Pas trop le temps de coder mais pourquoi ne pas faire des différents tutos des programmes a part entière?
    Cela vous permettrait de les mettre au point sans passer par le lanceur et de poursuivre la découverte de l'embarras et des solutions du découpage d'un tout en morceaux.
    Le morceau (i.e. le "tuto") deviendrait un script/module Python dont la structure serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import tkinter as tk
    ### ... le code du tuto...
    def main(...):
        ### ...lancement du corps du tuto
    if __name__ == '__main__':
        ###... execute lorsque lance comme script i.e. hors "lanceur"
    Appelons ce script tuto.py.
    Cote lanceur, la séquence serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import tuto
    ...
    # setup du Toplevel ou autre.
    tuto.main(Toplevel ou autre)
    # on attend que ca se termine
    Qu'en pensez vous?

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

  5. #5
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut ca marche !
    Bonjour Wiztricks et grand merci.

    Mon projet était de me faire une compilation pour pouvoir accéder aux petits programmes et leurs codes pour avoir un aide mémoire.

    Grâce aux conseils des uns et des autres,( notamment les vôtres ) j'ai réussi à mieux comprendre les façons de gérer les fenêtres, les widgets etc...
    ce qui est tout un monde pour un débutant. Un rien suffit à tout bloquer et au début il n'est pas facile de détecter la cause du problème.

    Votre dernière idée est épatante.

    Pour ceux que cela intéresserait je donne les codes ci-dessous.

    Tout d'abord le fichier accueil.py qui donne accès au choix à l'activité 1 ou à l'activité 2

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    from tkinter import *
     
    ###################  Page d'accueil   #######################
     
     
    fenetre=Tk()
    fenetre.geometry("600x400")
    fenetre.title("Compilation de tutoriels")
    fenetre.configure(bg = "lightblue")
     
    def lance1():
        import activite1
        activite1.main() 
     
    def lance2():
        import activite2
        activite2.main() 
     
    separator = Frame(height=20).pack()
     
    Button(fenetre,text="Activité 1", bg = "lightgreen",padx=7,pady=7,command = lance1).pack()
     
    separator = Frame(height=20).pack()
     
    Button(fenetre,text="Activité 2", bg = "lightgreen",padx=7,pady=7,command = lance2).pack()
     
    fenetre.mainloop()
    puis le fichier activite1.py dont 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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    from tkinter import *
    from tkinter import messagebox
     
     
    class main(Toplevel):
     
        # fenêtre satellite
     
        def __init__(self,couleur="beige"):
     
            Toplevel.__init__(self)
            self.geometry("600x400")    # "500x400+100+240" permettrait de décaler l'affichage
            self.overrideredirect(0)            # => si paramètre 1 fenêtre sans bordure ni bandeau
            self.transient(self.master)         # => fenêtre 'modale'
            self.configure(bg=couleur)
            self.title("Activité 1")
     
            self.protocol("WM_DELETE_WINDOW", self.vraimentfermer)  # procédure de contrôle de fermeture par clic sur la croix en haut à droite
     
            self.grab_set()      # rend actif les evenements souris ou clavier seulement sur cette fenetre
     
            Label(self,text="Ici se déroulerait l'activite 1", bg="lightblue",font="Arial 12",padx=10,pady=10).place(relx = 0.3, rely = 0.3)
     
            self.boutonpop=Button(self,text="Cliquez ici ou Appuyez sur q ou Return pour fermer", command=self.destroy,bg="lightgreen",name="boutonpop")
            self.boutonpop.place(width=380,height=30,relx=0.2,rely=0.6)
            self.boutonpop.focus_set()
     
            self.boutonpop.bind('<KeyPress>', self.on_key)
     
        def on_key(self,event):
     
     
            if (event.keysym is "q" or event.keycode is 104 or event.keycode is 36) :   # 104 code de return sur pave numerique
     
     
               self.destroy()    # effacement de la fenêtre satellite    
     
        def vraimentfermer(self):    # envoi ici lors d'un essai de fermeture par la croix de la fenêtre
     
            if messagebox.askokcancel("Quitter", "Voulez-vous vraiment quitter ?"):
                self.destroy()
     
    if __name__ == '__main__':
        Mafenetre = Tk()
        Mafenetre.title('Activite1')
        Mafenetre['bg']='bisque'
     
        # Création d'une instance de la classe main
        a=main()
     
        Mafenetre.mainloop()
    et de même pour activite2.py (même code que ci-dessus changer les 1 en 2 dans les lignes de code )
    Encore merci aux uns et aux autres pour tous ces conseils.

    Pour les nouveaux ( comme moi ) sur ce forum, je signale qu'en s'identifiant on a accès à une fonction recherche qui est très pratique.

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

    Améliorons encore un peu.
    Je sais que le mot clé "class" est fascinant et que quand on débute on essaie d'en foutre partout tellement on est content.
    En gros, vous avez besoin d'une "class" pour fabriquer des objets qui auront une interface similaire ou "factoriser" - regrouper, écrire une seule fois...
    Ici, l'objet qui se répète est le tuto. qui est devenu "module". L'astuce if __name__ == '__main__': permet de le lancer comme script et le point d’entrée "main" définit quoi appeler lorsqu’utilisé comme module.
    Que passer a main? Une instance de Tk ou une instance de Toplevel dont il devra se débrouiller.
    Le module devient donc une sorte de classe a laquelle on pourra ajouter d'autres attributs.
    D’où l'insistance a écrire import tkinter as tk plutôt que from tkinter import *.
    En Python, les espaces de noms sont plus importants que les "class".
    Concrètement, ç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
    30
    31
    32
    33
    34
    35
    import tkinter as tk
    from tkinter import messagebox
     
    TITLE = 'activite Y' 
     
    def main(app): 
        assert isinstance(app, (tk.Tk, tk.Toplevel)), 'fatal: expects Toplevel or app'
        app.title(TITLE)
        app['bg']='bisque'
        app.geometry("600x400") 
     
        def on_exit():
            if messagebox.askokcancel("Quitter", "Voulez-vous vraiment quitter ?"):
                app.destroy()
     
        app.protocol("WM_DELETE_WINDOW", on_exit)  # procédure de contrôle de fermeture par clic sur la croix en haut à droite
        if isinstance(app, tk.Toplevel):
            app.grab_set()      # rend actif les evenements souris ou clavier seulement sur cette fenetre
     
        w = tk.Label(app,
            text='Ici se déroulerait "%s"' % TITLE, 
            bg="lightblue", font="Arial 12", padx=10, pady=10)
        w.place(relx = 0.3, rely = 0.3)
     
        w = tk.Button(app,
                text="Cliquez ici ou Appuyez sur q ou Return pour fermer", 
                command=app.destroy,
                bg="lightgreen")
        w.place(width=380,height=30,relx=0.2,rely=0.6)
     
    if __name__ == '__main__':
     
        app = tk.Tk()
        main(app)
        app.mainloop()
    Après on a un bonus cote "lanceur".
    D'abord on lui colle la même structure.
    Puis on va construire automatiquement le menu des démos en imposant aux noms des scripts un format particulier du genre: "activite_nn.py".
    On récupéré la liste des fichiers du répertoire courant, on filtre ceux qui correspondent au format "activite_nn.py" et voila:
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    import tkinter as tk
    from importlib import import_module
    import os
    import re 
    ###################  Page d'accueil   #######################
     
    def lancer(module):
        w = tk.Toplevel(app)
        module.main(w)
        app.wait_window(w) 
     
    def create_menu(app):
        TAG = 'tkinter_lanceur_activite_' ##
        rs = r'(%s[\d]+).py' % TAG
        module_names = re.findall(rs, ' '.join(os.listdir('.')))
        #print (module_names)
     
        for name in module_names:        
            tk.Frame(app, height=20).pack() 
            module = import_module(name)
            btn = tk.Button(app, 
                text=module.TITLE, 
                bg = "lightgreen",
                padx=7,pady=7,
                command = lambda module=module: lancer(module))
            btn.pack()    
     
     
    def main(app):
        app.geometry("600x400")
        app.title("Compilation de tutoriels")
        app.configure(bg = "lightblue")
     
        create_menu(app)
     
    if __name__ == '__main__':
     
        app = tk.Tk()
        main(app)
        app.mainloop()
    Bonne lecture.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut De mieux en mieux et chapeau bas !
    J'ai suivi vos consignes, seul le filtrage ne fonctionne pas pour l'instant.
    Le temps de comprendre cette syntaxe de recherche d'expressions régulières, pour l'instant J'ai simplement ajouté la ligne 20 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    module_names = ['activite_1','activite_2']
    et tout baigne.

    A propos des classes :

    Comme partout on vantait l'utilisation des classes, je me suis mis à apprendre cette syntaxe lourde pour un débutant tout en me demandant quelle était l'utilité d'une classe si ce n'était pas pour pouvoir en hériter ensuite dans un autre programme, ce qui était ma situation le plus souvent.

    Pour l'heure je pense que sauf dans la création de gros programmes où on cherche la sécurité afin de ne pas utiliser plusieurs fois la même variable, il s'agit plutôt d'habitudes de codage.

    Car, sauf erreur de ma part, il y a de légères différences.
    Quand on code sans classes, si dans un Button on fait appel à , il faut auparavant que l'on ait mis dans le code
    tandis que si on code ce bouton, dans une classe et si on met et on peut mettre plus tard Peut-être que je me trompe. Je réfléchis tout haut à la fois pour avoir votre avis et pour en faire profiter d'autres, car j'ai déjà profité ici et là dans le forum de réflexions enrichissantes ( et parfois malicieuses quand elles se font entre vous les intervenants experts)

    Bon week-end à vous.

  8. #8
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Bonjour Wyztricks,

    Si ce n'est pas abuser pourriez-vous me commenter les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        TAG = 'tkinter_lanceur_activite_' ##
        rs = r'(%s[\d]+).py' % TAG
        module_names = re.findall(rs, ' '.join(os.listdir('.')))
    notamment l % TAG au sujet duquel je n'ai pas trouvé d'info

    J'ai remplacé ces lignes par la procédure suivante ,moins élégante, qui filtre tous les modules dont le nom comporte le mot activité par exemple "mon activite autour du Widget Button.py"
    et l'insère dans la liste module_names en "mon activite autour du Widget Button"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        dirs = os.listdir( '.' )  # crée une liste contenant la nom de tous les fichiers du répertoire courant
     
        module_names=[]
        i=0
        while i<len(dirs):
            if dirs[i].count('activite')>0:    #   teste si le nom du fichier contient le mot activite
                module_names.append(dirs[i].strip('.py'))    # dans ce cas élimine l'extension .py du nom du fichier et le met dans la liste des modules
            i+=1
     
        # print (module_names)
    Merci.

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

    Pour commencer par ce que ça fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> TAG = 'tkinter_lanceur_activite_' ##
    >>> rs = r'(%s[\d]+).py' % TAG
    >>> rs
    '(tkinter_lanceur_activite_[\\d]+).py'
    r'(%s[\d]+).py' % TAGconstruit une chaîne de caractères ou %s est remplace par str(TAG).
    C'est un héritage C qui est documente ici.

    Il y a des velléités dans la communauté Python de remplacer cela par string formatting introduit en 2.6.
    Mais c'est pas avant Python 4 et plutôt a l'horizon 2020... et la bataille pour retirer le format C est loin d’être gagnée.

    Techniquement, ce truc devrait être dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def get_module_names(tag, path='.'):
        rs = r'(%s[\d]+).py' % tag
        return re.findall(rs, ' '.join(os.listdir(path)))
    Ca permet de "tester" la fonction a part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def get_module_names(tag='activite_', path='.'):
        filenames = os.listdir( path ) 
        names=[]
        for name in filenames:
             if name.startswith(tag):
                   names.append(name.strip('.py')
        return names
    et tant qu'elle rend le service attendu, on la réalise comme on peut "rapidement".
    Plus tard, on pourra toujours améliorer "le détail" d'une réalisation qui pourrait aussi être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def get_module_names(tag='activite_', path='.'):
                      return [ 'activite_1', 'activite_2' ]
    D'un point de vue "programmation", l'important sera l'interface: get_module_names(tag, path) retourne la liste de... Comme c'est une fonction simple, tant qu'elle "fonctionne"...

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

  10. #10
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Grand merci et après avoir appris et expérimenté de nombreuses notions je clos le sujet.

    A ceux qui utiliseraient la technique strip que j"avais employée pour éliminer .py je signale qu'elle n'est pas infaillible. Elle élimine les caractères '.' 'p' et 'y' en début et fin de chaine.

    Ainsi "pyrenees Arnéguy.py" devient "renees Arnégu" ce qui n'en fait pas un nom de module utilisable.

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 745
    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 745
    Par défaut
    Citation Envoyé par couragecourage Voir le message
    A ceux qui utiliseraient la technique strip que j"avais employée pour éliminer .py je signale qu'elle n'est pas infaillible. Elle élimine les caractères '.' 'p' et 'y' en début et fin de chaine
    Techniquement, il faudrait s'assurer que la string se termine par '.py' puis supprimer les 3 derniers caractères.
    Ou passer par os.path.splitext qui retourne (nom, ext), verifier que ext est '.py'...
    Quelque soit le code, il y aura toujours des bugs.

    Mais comme le sujet traite du découpage d'un tout en morceaux, fabriquer des fonctions comme "get_module_names(tag, path)" avec des rôles biens définis permet de rendre les défauts gérables.

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

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

Discussions similaires

  1. [SP-2010] publier/dupliquer pages à plusieurs endroit ("envoyer vers"?)
    Par cortex024 dans le forum SharePoint
    Réponses: 1
    Dernier message: 19/06/2012, 18h00
  2. [Joomla!] Redirection vers une autre page d'accueil de celle de Joomla
    Par moustique95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 25/11/2008, 10h57
  3. Redirection de page index vers page d'accueil
    Par Mikke dans le forum Langage
    Réponses: 16
    Dernier message: 29/04/2008, 09h38
  4. Réponses: 21
    Dernier message: 30/01/2008, 23h39
  5. redirection vers page d'accueil
    Par champion dans le forum Langage
    Réponses: 8
    Dernier message: 21/04/2006, 15h16

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