[python/tkinter] Toplevel et subprocess

Résolu/Fermé
frites.saucisse - 28 mars 2008 à 14:57
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 31 mars 2008 à 09:24
Bonjour,
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é:


# -*- 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.

3 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
28 mars 2008 à 16:36
Pas testé, mais essaie de faire un pop.update() juste avant ton comp().
2
frites.saucisse
31 mars 2008 à 08:40
Merci pour la réponse. Ce pop.update() résout effectivement le problème.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
31 mars 2008 à 09:24
Je marque le problème comme "résolu".
(Pense à le faire la prochaine fois qu'un de tes problèmes est résolu :-)
0