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 :

Toplevel et subprocess


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut Toplevel et subprocess
    J'ai une application avec un bouton qui déclenche une compilation Latex (avec un subprocess.call()). Comme la compilation prend un certain temps, je souhaite avoir un popup sous forme de Toplevel qui dit à l'utilisateur "t'excite pas, je bosse" et disparaît lorsque la compilation est terminée. [Si dans ce popup pouvait s'afficher des informations sur l'avancée de la tâche en arrière plan (i.e. les informations qui sont affichées dans la console DOS) je serais encore plus heureux.]

    Pour les besoins du forum, j'ai essayé de bricoler un code simplifié:
    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
    # -*- coding: cp1252 -*-
     
    from Tkinter import *
    import subprocess
     
    def comp():
        for i in range(3):
            subprocess.call(["latex", "test.tex"])
     
    def start():
        pop=Toplevel()
        pop.resizable(width=False, height=False)
        pop.grab_set()
        pop.focus_set()
        pop.title("PopUp")
        w=250
        h=220
        pop.geometry("%dx%d+%d+%d" %(w,h,(pop.winfo_screenwidth()-w)/2,(pop.winfo_screenheight()-h)/2))
     
        ca=Canvas(pop,bd=0,highlightthickness=0,bg='white')
        ca.pack(fill=BOTH, expand=1)
     
        cb=Canvas(ca,bd=0,highlightthickness=0,bg='white')
        cb.grid(row=0, sticky=N+S+E+W)            
     
        ca.grid_rowconfigure(0, weight=1)
        ca.grid_columnconfigure(0, weight=1)
     
        lb=Label(cb,text='Je suis un popup',bg='white')
        lb.grid()
     
        comp()
        pop.destroy()
     
    root=Tk()
    wt=root.winfo_screenwidth()
    ht=root.winfo_screenheight()
    w=300
    h=300
    root.geometry("%dx%d+%d+%d" % (w,h, (wt-w)/2, (ht-h)/2 ) )
     
    # create a canvas with no internal border
    can=Canvas(root,bd=0, highlightthickness=0)
    can.pack(fill=BOTH, expand=1)
    Button(can, text='Start',command=start).pack()
    Button(can, text='Ciao',command=root.destroy).pack()
     
    root.mainloop()
    Le comportement de ce code est légèrement différent de celui de mon programme complet: ici, le popup n'apparaît simplement pas (ou peut-être disparaît-il trop vite); dans mon programme complet, la fenêtre apparaît mais n'est pas complète, comme si le programme oubliait de finir le popup avant de passer à la suite.

    Toute aide pour résoudre ce problème est la bienvenue! Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Décembre 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    j'ai changé un peu le script. Apparemment ca marche
    je vois pas trop le problème...?


    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
    # -*- coding: cp1252 -*-
     
    from Tkinter import *
    import subprocess
     
    def comp():
        for i in range(3):
            print "helo"*10000
     
    def start():
        pop=Toplevel()
        pop.resizable(width=False, height=False)
        pop.grab_set()
        pop.focus_set()
        pop.title("PopUp")
        w=250
        h=220
        pop.geometry("%dx%d+%d+%d" %(w,h,(pop.winfo_screenwidth()-w)/2,(pop.winfo_screenheight()-h)/2))
     
        ca=Canvas(pop,bd=0,highlightthickness=0,bg='white')
        ca.pack(fill=BOTH, expand=1)
     
        cb=Canvas(ca,bd=0,highlightthickness=0,bg='white')
        cb.grid(row=0, sticky=N+S+E+W)            
     
        ca.grid_rowconfigure(0, weight=1)
        ca.grid_columnconfigure(0, weight=1)
     
        lb=Label(cb,text='Je suis un popup',bg='white')
        lb.grid()
     
        comp()
        pop.destroy()
     
    root=Tk()
    wt=root.winfo_screenwidth()
    ht=root.winfo_screenheight()
    w=300
    h=300
    root.geometry("%dx%d+%d+%d" % (w,h, (wt-w)/2, (ht-h)/2 ) )
     
    # create a canvas with no internal border
    can=Canvas(root,bd=0, highlightthickness=0)
    can.pack(fill=BOTH, expand=1)
    Button(can, text='Start',command=start).pack()
    Button(can, text='Ciao',command=root.quit).pack()
     
    root.mainloop()
    root.destroy()
    Edité par Guigui_: et les balises [Code] ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Merci pour cette première réponse.
    Le problème vient dès qu'il y a un subprocess ... Je savais qu'autrement ça marchait bien.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Décembre 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    pas de quoi, je connais pas ce module subprocess
    mais s'il ne vous redonne pas la main c'est qu'il
    lance une nouvelle mainloop()...faut voir la doc
    du subprocess "latex" ?...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Je ne pense pas que le problème vienne de la commande exécutée par le subprocess. En inscrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.Popen(["notepad.exe", "test.tex"])
    (pas d'attente avant de retourner au programme principal) ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.call(["notepad.exe", "test.tex"])
    (avec attente), la fenêtre popup ne vient pas.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Décembre 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    d'après l'aide il y un
    check_call( *popenargs, **kwargs)
    ca dit quoi avec check_call ?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    Avec subprocess.check_call(), ça ne dit rien de plus qu'avec subprocess.call().

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 36
    Points
    36
    Par défaut Problème résolu
    La solution est d'ajouter pop.update() avant comp()

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

Discussions similaires

  1. Pb de Toplevel en arrière plan
    Par lipaika dans le forum Tkinter
    Réponses: 4
    Dernier message: 30/12/2007, 12h16
  2. fenêtre principale et Toplevels
    Par Chris33 dans le forum Tkinter
    Réponses: 2
    Dernier message: 07/11/2006, 08h48
  3. problème avec toplevel
    Par Chris33 dans le forum Tkinter
    Réponses: 8
    Dernier message: 15/09/2006, 09h24
  4. [tkinter] maintien d'un toplevel en 1er plan
    Par airod dans le forum Tkinter
    Réponses: 1
    Dernier message: 07/03/2006, 16h28
  5. [VB.NET]Ma Form entre une toplevel Form et une topMost popup
    Par jazz matazz dans le forum Windows Forms
    Réponses: 15
    Dernier message: 28/02/2006, 14h51

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