|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Étudiant Inscription : juin 2012 Messages : 5 ![]() |
Bonjour,
je recherche un moyen simple d´executer periodiquement (toutes les x min.) une commande. L´execution periodique doit commencer quand l´utilisateur appuie sur un bouton "commencer" et s´arreter lorsqu´il appuie sur un bouton "terminer". J´ai bien reussi avec Tkinter de Python a faire les boutons, mais je ne sais pas comment faire l´execution periodique qui s´arreterait quand on appuie sur un bouton. Quelqu´un pourrait-il me dire comment faire? Si possible sans trop consommer de ressource. |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Patrice BLANGARINTechnicien Help Desk, maintenance, réseau, système et + Inscription : juin 2006 Messages : 2 616 ![]() |
Bonjour,
Pas compris: Si c'est périodique pas besoin de bouton "commencer" /"terminer". Cela se passe via un daemon/thread etc... Et pas besoin de GUI. Pouvez vous préciser ce que vous voulez faire ? Pour ce qui est de Tkinter avez vous vus que le Widget Button a une option command ? C'est pour spécifier une fonction a exécuter. @+
__________________
Merci d'utiliser le forum pour les questions techniques. |
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé
![]() Patrice BLANGARINTechnicien Help Desk, maintenance, réseau, système et + Inscription : juin 2006 Messages : 2 616 ![]() |
Voila pour la partie GUI
Code :
@+
__________________
Merci d'utiliser le forum pour les questions techniques. |
||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 941 ![]() |
Salut,
Moi, je comprends plutôt que le bouton sert simplement à mettre en marche le timer et ensuite à le stopper. Si c'est bien cela, il suffit de montrer le code du timer, il doit bien y avoir un moyen de l'arrêter. |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Étudiant Inscription : juin 2012 Messages : 5 ![]() |
Ce que j´ entends par periodique c´est une repetition a intervalle regulier d´une commande jusqu´a ce que l´utilisateur dise: stop. L´information stop peut etre donne par GUI, ce n´est effectivement pas obligatoire, mais plus pratique.
Je pourrais lancer une boucle infinie genre: while true ma commande pause x min et "killer" le processus quand je veux l´arreter, mais ce n´est pas tres elegant comme methode! En fait j´ai ecrit un script python qui actualise une base de donnee. J´aimerai pouvoir lancer regulierement (toutes les x min.) ce script quand j´ai besoin d´avoir cette base de donnee toujours actualisee. Quand je n´en ai plus besoin, j´aimerais pouvoir arreter l´actualisation de ma base de donnee. |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 941 ![]() |
C'est bien ce que j'avais copris, mais ton 'timer' tu l'as écrit comment ?
Un thread ? threading.Timer ? Une boucle while, ça m'étonnerait. Bref, on veut du code. |
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 709 ![]() |
Salut
Avec Tkinter, vous avez la méthode .after(delay, callback) qui permet d'appeler la fonction "callback" après "delay" millisecondes. La discussion récente montre comment utiliser la chose pour "répéter" l'opération "tant que". La méthode .after retourne un identifiant qui pourra être passé en paramètre à la méthode .cancel pour arrêter le monstre. Ces méthodes .after, .cancel sont disponibles pour tous les widgets Tk. Vous pouvez aussi lire la discussion qui traite de ce sujet. Ces indications devrait vous permettre d'écrire un premier code et de râler sur les aspects que vous ne comprenez pas. - W
__________________
Architectures Post-Modernes |
|
|
10
|
|
|
#8 | ||
|
Invité de passage
![]() Étudiant Inscription : juin 2012 Messages : 5 ![]() |
La methode .after(delay, callback) marche nickel! Par contre je n´arrive pas a l´arreter avec le .cancel. Comment utilise-t-on le .cancel? Auriez-vous un exemple?
Voici un extrait de mon code: Code :
|
||
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 709 ![]() |
Désolé, j'ai m...
Il faut utiliser .after_cancel et non .cancel (que je ne sais même pas ce que c'est): Un exemple posté, il y a longtemps: Code :
__________________
Architectures Post-Modernes |
||
|
|
10
|
|
|
#10 | ||
|
Invité de passage
![]() Étudiant Inscription : juin 2012 Messages : 5 ![]() |
Merci ca marche nickel!
Mon code si ca interesse quelqu´un: Code :
|
||
|
|
00
|
|
|
#11 | ||||||||||
|
Expert Confirmé
![]() Patrice BLANGARINTechnicien Help Desk, maintenance, réseau, système et + Inscription : juin 2006 Messages : 2 616 ![]() |
Bonjour,
Deux ou trois petites choses qui me sont venues à l'esprit à la lecture du code: Ne mélanger pas tabulations et espaces. Pas besoin de global puisque vous avez self. Utilisez parent.destroy et non f.quit. Le fait d'utiliser le même nom pour tout vos Widgets Button fait vous écrasez la référence à chaque fois. Mais au fait: Pourquoi la garder puisque seul command nous intéresses. padx=0,pady=0 ne sert à rien. De même ici les side= puisque .pack() le places de haut en bas. Mais bon, cela ne gène en rien. L’intérêt du Label hors de la Frame ? Et l’intérêt de la Frame en fait puisque .pack() positionne les Widgets de haut en bas ? root.after(1000, self.update_loop) ? self.parent.after(1000, self.update_loop) En fait. Code :
Astuce: Lorsque vous utilisez les mêmes options de géométrie pour un groupe de Widget vous pouvez utiliser un dico. L’intérêt de la classe ici ? A la limite si cela dérive de Tk. if self.counter_id est source à erreur (AttributeError) si vous cliquez sur stop avant. Soit vous utilisez hasattr, soit (le plus simple) vous donnez une valeur à self.counter_id. Code :
Code :
Code :
Code :
Edit: Bonus géométrique geometry = {'padx': 10, 'pady': 10, 'fill': tk.BOTH} Edit: Erreur de tabulation.
__________________
Merci d'utiliser le forum pour les questions techniques. |
||||||||||
|
|
10
|
|
|
#12 | ||||
|
Invité de passage
![]() Étudiant Inscription : juin 2012 Messages : 5 ![]() |
En fait mon code c´ est de la recupe de codes que j'ai trouve sur internet. D'ou toutes les incoherences. Je debute en python, c'est l'un de mes premiers codes.
En tous cas, merci a tous pour votre aide! Juste une petite derniere question. L'execution de la boucle periodique n'est en fait pas exactement periodique. La periode d'execution de la fonction update_loop: Code :
Bon dans ce cas, l'execution de print est quasi instantannee, donc ca n'a pas d'importance. Mais j'utilise ce code pour lancer un autre python (actualiser une base de donnee), dont le temps d'execution est non negligeable et irregulier. La meilleure solution que j'ai trouve pour que la periode d'execution de la fonction update_loop soit independante de la duree de l'application que je lance (ici print(entry.get()) ), c'est de mettre le root.after avant le print: Code :
|
||||
|
|
00
|
|
|
#13 | ||
|
Expert Confirmé
![]() Patrice BLANGARINTechnicien Help Desk, maintenance, réseau, système et + Inscription : juin 2006 Messages : 2 616 ![]() |
C'est bien cela.
Je rajouterais que si vous modifiez quelque chose il n'est sans doute pas bon de lancer le même traitement deux fois en même temps, dans le cas ou le premier n'est pas fini. Comprendre que votre traitement doit 'signaler' qu'il a fini avant d'en faire un autre. Code :
__________________
Merci d'utiliser le forum pour les questions techniques. |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com