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 :

Conseil pour un affichage fluide [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut Conseil pour un affichage fluide
    Lecteurs de ce message, je vous salue.

    Lorsque l'on démarre un logiciel quelconque, et que ce logiciel nous affiche une information au lancement (avertissement, mise à jour disponible, tutoriel ...), il se passe ceci :

    - La fenêtre principale du logiciel s'ouvre mais est inactive
    - Une pop-up s'ouvre nous affichant cette information
    - On réalise une action sur cette pop-up qui se ferme
    - La fenêtre principale se complète et redevient active

    Donc, quelle est le moyen le plus propre de coder cela avec Tkinter ? (orienté objet)

    J'ai répondu à cette question de la manière ci dessous, mais je ne suis pas sûr que ce soit le moyen le plus propre.
    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 MonProgramme:
     
        def __init__(self):
     
            self.fenetre = Fenetre() #Fenetre est une classe héritant de tk.Tk
            self.attente_popup()
            self.afficher_contenu()
            self.fenetre.mainloop()
     
        def attente_popup(self):
     
            popup = Popup(self.fenetre) # Popup est une classe héritant de tk.Toplevel
            popup.transient(self.fenetre)
            self.fenetre.wait_window(popup)
     
        def afficher_contenu(self):
     
            conteneur = Conteneur(self.fenetre, nom='conteneur') # Conteneur est une classe héritant de tk.Canvas
            conteneur.place(x=10, y=10)
    C'est avec "self.fenetre.wait_window(popup)" que je concrétise ce que je souhaite. Je choisi aussi d'utiliser "popup.transient(self.fenetre)" après avoir consulté cette discussion.

    Cependant je ne suis pas parfaitement satisfait, car je constate un ordre d'affichage biaisé, même s'il est très furtif :

    - Ma fenêtre principale s'affiche (normal, je la créer en premier)
    - Ma popup s'affiche (normal, je l'appelle par la suite)
    - Ma fenêtre principale se ré-affiche par dessus ma popup (mais pourquoi ? mon mainloop ? mais il est après dans mon programme ...)
    - Ma popup se ré-affiche par dessus ma fenêtre principale (normal puisque j'ai appelé la fonction .transient )

    Le tout en à peine un quart de seconde mais ça me perturbe tout de même. Et je comprends par cet enchaînement que je n'ai pas choisi le moyen le plus propre de coder ça.
    Je remercie les lecteurs de ce message pour les conseils apportés.

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

    Citation Envoyé par Leododo Voir le message
    Donc, quelle est le moyen le plus propre de coder cela avec Tkinter ? (orienté objet)
    Techniquement, çà s'appelle un splashscreen.
    Un peu de recherche sur Internet vous permettrait d'avoir des tas d'exemples.
    Mais à la base c'est une fenêtre (pas nécessairement la fenêtre principale) sans bord que l'ont place au centre de l'écran et dans laquelle on pourra afficher images, texte, progressbar,... qui permet à l'utilisateur de patienter pendant que l'application s'initialise.


    Citation Envoyé par Leododo Voir le message
    J'ai répondu à cette question de la manière ci dessous, mais je ne suis pas sûr que ce soit le moyen le plus propre.

    Si vous postez un code qui ne permet pas de reproduire quoi que ce soit et qui encapsule des appels à tkinter qu'on doit deviner...

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

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Techniquement, çà s'appelle un splashscreen.
    Je regarde ça.
    Edit : C'est effectivement très proche de ce dont j'ai en tête, cependant je compte mettre deux boutons sur ma fenêtre "popup", et pré-afficher ma fenêtre principale derrière ma fenêtre popup. Donc par définition, ce que je souhaite est différent d'un splashcreen, dans le sens où c'est l'action de l'utilisateur qui la détruira, et non une fin de chargement par exemple. Mais je retiens ça, j'ai d'ailleurs trouvé des exemples très fonctionnels.

    Citation Envoyé par wiztricks Voir le message
    Si vous postez un code qui ne permet pas de reproduire quoi que ce soit et qui encapsule des appels à tkinter qu'on doit deviner...
    J'ai condensé mon code en un script directement utilisable:

    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
     
    import tkinter as tk
     
     
    class Fenetre(tk.Tk):
     
        def __init__(self):
            tk.Tk.__init__(self)
            self.state('zoomed')
     
     
    class Popup(tk.Toplevel):
     
        def __init__(self, fenetre):
            tk.Toplevel.__init__(self, master=fenetre)
            x = (self.winfo_screenwidth() // 2) - (800 // 2)
            y = (self.winfo_screenheight() // 2) - (400 // 2)
            self.geometry('{}x{}+{}+{}'.format(800, 400, x, y))
     
     
    class Conteneur(tk.Canvas):
     
        def __init__(self, fenetre, nom):
            super().__init__(master=fenetre, name=nom, width=200, height=200, bg='gray')
     
     
    class MonProgramme:
     
        def __init__(self):
            self.fenetre = Fenetre()  # Fenetre est une classe héritant de tk.Tk
            self.attente_popup()
            self.afficher_contenu()
            self.fenetre.mainloop()
     
        def attente_popup(self):
            popup = Popup(self.fenetre)  # Popup est une classe héritant de tk.Toplevel
            popup.transient(self.fenetre)
            self.fenetre.wait_window(popup)
     
        def afficher_contenu(self):
            conteneur = Conteneur(self.fenetre, nom='conteneur')  # Conteneur est une classe héritant de tk.Canvas
            conteneur.place(x=10, y=10)
     
     
    if __name__ == '__main__':
        MonProgramme()

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

    Désolé mais avec le code que vous avez posté je ne vois pas de problème:
    - Ma fenêtre principale s'affiche (normal, je la créer en premier)
    - Ma popup s'affiche (normal, je l'appelle par la suite)
    - Ma fenêtre principale se ré-affiche par dessus ma popup (mais pourquoi ? mon mainloop ? mais il est après dans mon programme ...)
    - Ma popup se ré-affiche par dessus ma fenêtre principale (normal puisque j'ai appelé la fonction .transient )
    soit çà va trop vite soit je ne regarde pas ce qu'il faut.

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

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    ah

    Pour vérifier, j'ai utilisé time.sleep(1) et je l'ai inséré à tous les endroits possible dans l'__init__ et l'attente_popup. Et quelque soit l'endroit où je le mets, cela apparaît toujours de la même manière.

    Donc j'ai codé une fonction qui créé 500 labels dans ma popup. Mon PC prends un peu de temps à la faire, et là je constate bien que le tout petit délai de ré-affichage est le même, il ne dépends donc pas de la "lourdeur" du nombre de widgets dans ma popup ...

    J'en conclu que c'est donc l'affichage normal :/
    En tout cas merci !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/09/2011, 07h28
  2. joomla.1.5: Conseils pour affichages menu
    Par Lem14 dans le forum Mon site
    Réponses: 3
    Dernier message: 24/10/2010, 00h47
  3. Réponses: 6
    Dernier message: 25/10/2006, 11h47
  4. Conseils pour poser votre question...
    Par Community Management dans le forum XMLRAD
    Réponses: 0
    Dernier message: 30/01/2003, 16h58
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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