Plus joli :
Bonjour,
J'ai un problème avec mon interface graphique wxpython. J'affiche un
StaticText juste avant le lancement d'une tâche qui doit créer un fichier
Excel. Souci : le StaticText n'a pas le temps de s'afficher totalement
avant
le lancement de la tâche.
Même problème si je fais un time.sleep(n) après un StaticText, le sleep
se lance avant l'affichage complet du texte, et c'est très moche.
Une solution à proposer, genre rafraîchissement d'écran ou autre ?
Merci de vos pythonesques lumières.
Plus joli :
Bonjour,
J'ai un problème avec mon interface graphique wxpython. J'affiche un
StaticText juste avant le lancement d'une tâche qui doit créer un fichier
Excel. Souci : le StaticText n'a pas le temps de s'afficher totalement
avant
le lancement de la tâche.
Même problème si je fais un time.sleep(n) après un StaticText, le sleep
se lance avant l'affichage complet du texte, et c'est très moche.
Une solution à proposer, genre rafraîchissement d'écran ou autre ?
Merci de vos pythonesques lumières.
Plus joli :
Bonjour,
J'ai un problème avec mon interface graphique wxpython. J'affiche un
StaticText juste avant le lancement d'une tâche qui doit créer un fichier
Excel. Souci : le StaticText n'a pas le temps de s'afficher totalement
avant
le lancement de la tâche.
Même problème si je fais un time.sleep(n) après un StaticText, le sleep
se lance avant l'affichage complet du texte, et c'est très moche.
Une solution à proposer, genre rafraîchissement d'écran ou autre ?
Merci de vos pythonesques lumières.
Dans tous les cas, un time.sleep() ne peut absolument pas aider. Bien au contraire.
Il faut bien avoir en tête que l'interface graphique d'une application tourne dans un et unique thread. Si tu bloques ce thread
avec un time.sleep(), c'est toute l'interface graphique qui est bloquée.
Dans ton code, lorsque tu "mets à jour" un StaticText, en réalité, tu ne fais que demander la mise à jour. La vraie mise à jour
est faiti5e à postériori, quand tu rends la main au système graphique, c'est à dire quand la fonction en cours d'exécution se
termine. Ce n'est donc pas de ce coté qu'il faut chercher une solution.
Comment est effectuée la tâche ?
Directement en appelant une fonction/méthode ?
En lançant une application/un thread ?
Dans tous les cas, un time.sleep() ne peut absolument pas aider. Bien au contraire.
Il faut bien avoir en tête que l'interface graphique d'une application tourne dans un et unique thread. Si tu bloques ce thread
avec un time.sleep(), c'est toute l'interface graphique qui est bloquée.
Dans ton code, lorsque tu "mets à jour" un StaticText, en réalité, tu ne fais que demander la mise à jour. La vraie mise à jour
est faiti5e à postériori, quand tu rends la main au système graphique, c'est à dire quand la fonction en cours d'exécution se
termine. Ce n'est donc pas de ce coté qu'il faut chercher une solution.
Comment est effectuée la tâche ?
Directement en appelant une fonction/méthode ?
En lançant une application/un thread ?
Dans tous les cas, un time.sleep() ne peut absolument pas aider. Bien au contraire.
Il faut bien avoir en tête que l'interface graphique d'une application tourne dans un et unique thread. Si tu bloques ce thread
avec un time.sleep(), c'est toute l'interface graphique qui est bloquée.
Dans ton code, lorsque tu "mets à jour" un StaticText, en réalité, tu ne fais que demander la mise à jour. La vraie mise à jour
est faiti5e à postériori, quand tu rends la main au système graphique, c'est à dire quand la fonction en cours d'exécution se
termine. Ce n'est donc pas de ce coté qu'il faut chercher une solution.
Comment est effectuée la tâche ?
Directement en appelant une fonction/méthode ?
En lançant une application/un thread ?
"NicolasP" a écrit dans le message de news:
4b7270e5$0$10476$
Dans tous les cas, un time.sleep() ne peut absolument pas aider. Bien
au contraire.
Il faut bien avoir en tête que l'interface graphique d'une application
tourne dans un et unique thread. Si tu bloques ce thread avec un
time.sleep(), c'est toute l'interface graphique qui est bloquée.
Dans ton code, lorsque tu "mets à jour" un StaticText, en réalité, tu
ne fais que demander la mise à jour. La vraie mise à jour est faiti5e
à postériori, quand tu rends la main au système graphique, c'est à
dire quand la fonction en cours d'exécution se termine. Ce n'est donc
pas de ce coté qu'il faut chercher une solution.
Comment est effectuée la tâche ?
Directement en appelant une fonction/méthode ?
En lançant une application/un thread ?
En fait, globalement, il s'agit d'une zone où sont affichés des messages de
statut, je veux simplement qu'il y ait 1 ou 2 secondes entre "connexion OK"
et "Attendez pendant la création du fichier Excel". Avec le sleep entre les
deux, le "connexion OK" s'affiche partiellement, ne disparaît pas vraiment
avant l'affichage de l'autre message, bref c'est très moche. Sans le sleep,
tout est ok, mais évidemment la transition est trop rapide.
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
"NicolasP" <nicolasp@aaton.com> a écrit dans le message de news:
4b7270e5$0$10476$426a74cc@news.free.fr...
Dans tous les cas, un time.sleep() ne peut absolument pas aider. Bien
au contraire.
Il faut bien avoir en tête que l'interface graphique d'une application
tourne dans un et unique thread. Si tu bloques ce thread avec un
time.sleep(), c'est toute l'interface graphique qui est bloquée.
Dans ton code, lorsque tu "mets à jour" un StaticText, en réalité, tu
ne fais que demander la mise à jour. La vraie mise à jour est faiti5e
à postériori, quand tu rends la main au système graphique, c'est à
dire quand la fonction en cours d'exécution se termine. Ce n'est donc
pas de ce coté qu'il faut chercher une solution.
Comment est effectuée la tâche ?
Directement en appelant une fonction/méthode ?
En lançant une application/un thread ?
En fait, globalement, il s'agit d'une zone où sont affichés des messages de
statut, je veux simplement qu'il y ait 1 ou 2 secondes entre "connexion OK"
et "Attendez pendant la création du fichier Excel". Avec le sleep entre les
deux, le "connexion OK" s'affiche partiellement, ne disparaît pas vraiment
avant l'affichage de l'autre message, bref c'est très moche. Sans le sleep,
tout est ok, mais évidemment la transition est trop rapide.
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
"NicolasP" a écrit dans le message de news:
4b7270e5$0$10476$
Dans tous les cas, un time.sleep() ne peut absolument pas aider. Bien
au contraire.
Il faut bien avoir en tête que l'interface graphique d'une application
tourne dans un et unique thread. Si tu bloques ce thread avec un
time.sleep(), c'est toute l'interface graphique qui est bloquée.
Dans ton code, lorsque tu "mets à jour" un StaticText, en réalité, tu
ne fais que demander la mise à jour. La vraie mise à jour est faiti5e
à postériori, quand tu rends la main au système graphique, c'est à
dire quand la fonction en cours d'exécution se termine. Ce n'est donc
pas de ce coté qu'il faut chercher une solution.
Comment est effectuée la tâche ?
Directement en appelant une fonction/méthode ?
En lançant une application/un thread ?
En fait, globalement, il s'agit d'une zone où sont affichés des messages de
statut, je veux simplement qu'il y ait 1 ou 2 secondes entre "connexion OK"
et "Attendez pendant la création du fichier Excel". Avec le sleep entre les
deux, le "connexion OK" s'affiche partiellement, ne disparaît pas vraiment
avant l'affichage de l'autre message, bref c'est très moche. Sans le sleep,
tout est ok, mais évidemment la transition est trop rapide.
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Comme je le disais dans mon précédent message, ça ne peut pas marcher.
Tu es sûr de vouloir faire poireauter l'utilisateur pour rien ?
Un moyen pour arriver à tes fins serait de déclencher un timer auquel tu passes une fonction de callback qui fera ce qui se >
trouve après le sleep(). Et tu vires le sleep() bien sûr.
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Comme je le disais dans mon précédent message, ça ne peut pas marcher.
Tu es sûr de vouloir faire poireauter l'utilisateur pour rien ?
Un moyen pour arriver à tes fins serait de déclencher un timer auquel tu passes une fonction de callback qui fera ce qui se >
trouve après le sleep(). Et tu vires le sleep() bien sûr.
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Comme je le disais dans mon précédent message, ça ne peut pas marcher.
Tu es sûr de vouloir faire poireauter l'utilisateur pour rien ?
Un moyen pour arriver à tes fins serait de déclencher un timer auquel tu passes une fonction de callback qui fera ce qui se >
trouve après le sleep(). Et tu vires le sleep() bien sûr.
"NicolasP" a écrit dans le message de news:
4b72dd39$0$4622$Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Comme je le disais dans mon précédent message, ça ne peut pas marcher.
Tu es sûr de vouloir faire poireauter l'utilisateur pour rien ?
Un moyen pour arriver à tes fins serait de déclencher un timer auquel
tu passes une fonction de callback qui fera ce qui se > trouve après
le sleep(). Et tu vires le sleep() bien sûr.
Je viens de me rendre compte que le problème ne vient pas du "sleep",
c'est bel et bien que la fonction de génération du fichier Excel se lance
avant la fin de l'affichage du texte.
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
u'Comic Sans MS'))
GenerateExcelJanuary()
Une autre idée ?
"NicolasP" <nicolasp@aaton.com> a écrit dans le message de news:
4b72dd39$0$4622$426a74cc@news.free.fr...
Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Comme je le disais dans mon précédent message, ça ne peut pas marcher.
Tu es sûr de vouloir faire poireauter l'utilisateur pour rien ?
Un moyen pour arriver à tes fins serait de déclencher un timer auquel
tu passes une fonction de callback qui fera ce qui se > trouve après
le sleep(). Et tu vires le sleep() bien sûr.
Je viens de me rendre compte que le problème ne vient pas du "sleep",
c'est bel et bien que la fonction de génération du fichier Excel se lance
avant la fin de l'affichage du texte.
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
u'Comic Sans MS'))
GenerateExcelJanuary()
Une autre idée ?
"NicolasP" a écrit dans le message de news:
4b72dd39$0$4622$Code source :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
time.sleep(2)
labelState.Destroy()
labelState = wx.StaticText(self, -1, pos=(30,395),label="Patientez
pendant la génération du fichier Excel...")
Comme je le disais dans mon précédent message, ça ne peut pas marcher.
Tu es sûr de vouloir faire poireauter l'utilisateur pour rien ?
Un moyen pour arriver à tes fins serait de déclencher un timer auquel
tu passes une fonction de callback qui fera ce qui se > trouve après
le sleep(). Et tu vires le sleep() bien sûr.
Je viens de me rendre compte que le problème ne vient pas du "sleep",
c'est bel et bien que la fonction de génération du fichier Excel se lance
avant la fin de l'affichage du texte.
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
u'Comic Sans MS'))
GenerateExcelJanuary()
Une autre idée ?
Ton code sera comme ceci :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False, u'Comic Sans MS'))
Creation et Lancement du threadtravailleur.
Tu n'as pas le choix. C'est la seule solution.
Nicolas
Ton code sera comme ceci :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False, u'Comic Sans MS'))
Creation et Lancement du threadtravailleur.
Tu n'as pas le choix. C'est la seule solution.
Nicolas
Ton code sera comme ceci :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False, u'Comic Sans MS'))
Creation et Lancement du threadtravailleur.
Tu n'as pas le choix. C'est la seule solution.
Nicolas
"NicolasP" a écrit dans le message de news:
4b742f3a$0$9106$
Ton code sera comme ceci :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
u'Comic Sans MS'))
Creation et Lancement du threadtravailleur.
Tu n'as pas le choix. C'est la seule solution.
Nicolas
Ca marche, mais du coup ça amène d'autres problèmes. Le thread
travailleur se lance,
le premier texte s'affiche entièrement, mais le fait que le thread
principal continue ne
m'arrange pas vraiment, étant donné que quelque chose comme "Fichier
terminé" doit
s'afficher seulement après la fin du travail, et d'autres soucis aussi.
J'utilise :
t = thread.start_new_thread(GenerateExcelFebruary,(self,))
Y'a-t-il une possibilité de mettre une condition sur la fin du thread
travailleur, du genre
"if t.end()" ?
"NicolasP" <nicolasp@aaton.com> a écrit dans le message de news:
4b742f3a$0$9106$426a74cc@news.free.fr...
Ton code sera comme ceci :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
u'Comic Sans MS'))
Creation et Lancement du threadtravailleur.
Tu n'as pas le choix. C'est la seule solution.
Nicolas
Ca marche, mais du coup ça amène d'autres problèmes. Le thread
travailleur se lance,
le premier texte s'affiche entièrement, mais le fait que le thread
principal continue ne
m'arrange pas vraiment, étant donné que quelque chose comme "Fichier
terminé" doit
s'afficher seulement après la fin du travail, et d'autres soucis aussi.
J'utilise :
t = thread.start_new_thread(GenerateExcelFebruary,(self,))
Y'a-t-il une possibilité de mettre une condition sur la fin du thread
travailleur, du genre
"if t.end()" ?
"NicolasP" a écrit dans le message de news:
4b742f3a$0$9106$
Ton code sera comme ceci :
labelState = wx.StaticText(self, -1, pos=(80,395),label="Connexion OK")
labelState.SetForegroundColour("#00FF00")
labelState.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False,
u'Comic Sans MS'))
Creation et Lancement du threadtravailleur.
Tu n'as pas le choix. C'est la seule solution.
Nicolas
Ca marche, mais du coup ça amène d'autres problèmes. Le thread
travailleur se lance,
le premier texte s'affiche entièrement, mais le fait que le thread
principal continue ne
m'arrange pas vraiment, étant donné que quelque chose comme "Fichier
terminé" doit
s'afficher seulement après la fin du travail, et d'autres soucis aussi.
J'utilise :
t = thread.start_new_thread(GenerateExcelFebruary,(self,))
Y'a-t-il une possibilité de mettre une condition sur la fin du thread
travailleur, du genre
"if t.end()" ?
Il s'agit d'une boite de dialogue qui affiche une barre de progression et un pourcentage ou un statut. Cette boite de dialogue crée >et lance un thread travailleur.
SendLogo est une classe à moi qui envoie des données sur une liaison série. Dans cette classe, UpdateProgress et UpdateText >sont utilisés pour mettre à jour la barre de progression lors de l'envoi des données. A la fin de l'envoi, le message "Done" est >envoyé à la boite de dialogue pour que le bouton "ok" soit dégrisé et donc cliquable.
A noter que le format des données des messages est perso. Ce n'est pas imposé.
Il s'agit d'une boite de dialogue qui affiche une barre de progression et un pourcentage ou un statut. Cette boite de dialogue crée >et lance un thread travailleur.
SendLogo est une classe à moi qui envoie des données sur une liaison série. Dans cette classe, UpdateProgress et UpdateText >sont utilisés pour mettre à jour la barre de progression lors de l'envoi des données. A la fin de l'envoi, le message "Done" est >envoyé à la boite de dialogue pour que le bouton "ok" soit dégrisé et donc cliquable.
A noter que le format des données des messages est perso. Ce n'est pas imposé.
Il s'agit d'une boite de dialogue qui affiche une barre de progression et un pourcentage ou un statut. Cette boite de dialogue crée >et lance un thread travailleur.
SendLogo est une classe à moi qui envoie des données sur une liaison série. Dans cette classe, UpdateProgress et UpdateText >sont utilisés pour mettre à jour la barre de progression lors de l'envoi des données. A la fin de l'envoi, le message "Done" est >envoyé à la boite de dialogue pour que le bouton "ok" soit dégrisé et donc cliquable.
A noter que le format des données des messages est perso. Ce n'est pas imposé.
"NicolasP" a écrit dans le message de news: 4b755ebc$0$4685$
Il s'agit d'une boite de dialogue qui affiche une barre de progression et un pourcentage ou un statut. Cette boite de dialogue crée>et lance un thread travailleur.
SendLogo est une classe à moi qui envoie des données sur une liaison série. Dans cette classe, UpdateProgress et UpdateText>sont utilisés pour mettre à jour la barre de progression lors de l'envoi des données. A la fin de l'envoi, le message "Done" est>envoyé à la boite de dialogue pour que le bouton "ok" soit dégrisé et donc cliquable.
A noter que le format des données des messages est perso. Ce n'est pas imposé.
Ok, je mets ton script de tout côté, qui pourra me servir plus tard dans l'avancée du
projet. En attendant, étant donné la petitesse du problème (afficher un "traitement du fichier"
après un "connexion ok") je vais simplement afficher le deuxième en dessous du premier.
Grâce au thread travailleur, j'ai déjà résolu un problème, et j'ai réussi à faire une progression
en pourcentage qui marche bien.
Merci encore pour ton aide !
"NicolasP"<nicolasp@aaton.com> a écrit dans le message de news: 4b755ebc$0$4685$426a74cc@news.free.fr...
Il s'agit d'une boite de dialogue qui affiche une barre de progression et un pourcentage ou un statut. Cette boite de dialogue crée>et lance un thread travailleur.
SendLogo est une classe à moi qui envoie des données sur une liaison série. Dans cette classe, UpdateProgress et UpdateText>sont utilisés pour mettre à jour la barre de progression lors de l'envoi des données. A la fin de l'envoi, le message "Done" est>envoyé à la boite de dialogue pour que le bouton "ok" soit dégrisé et donc cliquable.
A noter que le format des données des messages est perso. Ce n'est pas imposé.
Ok, je mets ton script de tout côté, qui pourra me servir plus tard dans l'avancée du
projet. En attendant, étant donné la petitesse du problème (afficher un "traitement du fichier"
après un "connexion ok") je vais simplement afficher le deuxième en dessous du premier.
Grâce au thread travailleur, j'ai déjà résolu un problème, et j'ai réussi à faire une progression
en pourcentage qui marche bien.
Merci encore pour ton aide !
"NicolasP" a écrit dans le message de news: 4b755ebc$0$4685$
Il s'agit d'une boite de dialogue qui affiche une barre de progression et un pourcentage ou un statut. Cette boite de dialogue crée>et lance un thread travailleur.
SendLogo est une classe à moi qui envoie des données sur une liaison série. Dans cette classe, UpdateProgress et UpdateText>sont utilisés pour mettre à jour la barre de progression lors de l'envoi des données. A la fin de l'envoi, le message "Done" est>envoyé à la boite de dialogue pour que le bouton "ok" soit dégrisé et donc cliquable.
A noter que le format des données des messages est perso. Ce n'est pas imposé.
Ok, je mets ton script de tout côté, qui pourra me servir plus tard dans l'avancée du
projet. En attendant, étant donné la petitesse du problème (afficher un "traitement du fichier"
après un "connexion ok") je vais simplement afficher le deuxième en dessous du premier.
Grâce au thread travailleur, j'ai déjà résolu un problème, et j'ai réussi à faire une progression
en pourcentage qui marche bien.
Merci encore pour ton aide !