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

Python Discussion :

bouton pour démarer et arrêter un boucle [Python 2.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 21
    Points
    21
    Par défaut bouton pour démarer et arrêter un boucle
    Bonjour,

    Je suis débutant en python et cela fait plusieurs heures que je tente de réaliser un programme avec deux boutons tkinter, le premier pour lancer une boucle et le deuxième pour l'arrêter. Pour ne pas bloquer l'interface, j'ai donc créer 2 thread, a et b, et une boucle dépendante de GLOBAL. b devrait couper la boucle en mettant GLOBAL à 0. pourtant, la boucle continue de tourner :
    J'utilise python 2.7

    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
     
    from Tkinter import *
    import threading 
     
    GLOBAL=1;
     
     
    def lancer():
    	while 1==1:
    		if(GLOBAL==1):
    			print GLOBAL
     
    def stop():
    	GLOBAL=0
    	print GLOBAL
     
    a = threading.Thread(None, lancer, None) 
    b = threading.Thread(None, stop, None) 
     
    fenetre = Tk()
    bouton_lancer = Button(fenetre, text="Lancer", command=a.start)
    bouton_lancer.pack()
    bouton_stop = Button(fenetre, text="stop", command=b.start)
    bouton_stop.pack()
    fenetre.mainloop()
    Je ne sais comment me sortir de cette situation
    Merci pour votre aide
    Léo-Nils

  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 776
    Points
    36 776
    Par défaut
    Salut,

    C'est pas parce que vous avez nommé une variable GLOBAL qu'elle est "globale"...
    Et la solution sera d'ouvrir un tuto. pour essayer de comprendre ces concepts là plutôt que de perdre votre temps à essayer de coder un truc qui ne marchera jamais tant que vous n'aurez pas pris le temps d'essayer de comprendre comment faire.

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

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Avant d'utiliser les modules complexes, les bases sont obligatoires...

    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
    GLOBAL = 1
     
    def read_global():
        print("pas de bol !")
        print("La variable GLOBAL vaut toujours {}".format(GLOBAL))
     
    def set_global():
        GLOBAL = 0
        print("variable soit disant modifiée...")
     
    print("Je tente de modifier la variable GLOBAL")
    set_global()
    print("Je tente de lire la variable GLOBAL")
    read_global()
    print("Ah c'est dommage !")
    Je tente de modifier la variable GLOBAL
    variable soit disant modifiée...
    Je tente de lire la variable GLOBAL
    pas de bol !
    La variable GLOBAL vaut toujours 1
    Ah c'est dommage !
    EDIT: grilled
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Merci pour vos précieux conseils,
    Je suis allé en effet un peu vite dans l'apprentissage de Python, et je pensait que l'usage des variables était semblable au C ou au Javascript, où ce qui est déclaré or des fonctions est global. Le nom GLOBAL n'est ici que pour que je puisse repérer les rôles de chaque variables pour réutiliser mes programmes plus facilement.

    Merci encore
    Bonne soirée

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Maintenant faut pas grand chose

    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
    GLOBAL = 1
     
    def read_global():
        print("La variable GLOBAL vaut {}".format(GLOBAL))
     
    def set_global():
        global GLOBAL
        GLOBAL = 0
        print("variable modifiée...")
     
    print("Je tente de modifier la variable GLOBAL")
    set_global()
    print("Je tente de lire la variable GLOBAL")
    read_global()
    print("Super !")
    Je tente de modifier la variable GLOBAL
    variable modifiée...
    Je tente de lire la variable GLOBAL
    La variable GLOBAL vaut 0
    Super !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 21
    Points
    21
    Par défaut solution
    Pour ceux que la solution pourrait intéresser, voici un code qui lorsque l'on clique sur le premier bouton, lance une action répétitive, et l’arrête l'orque l'on clique sur le bouton juste en dessous.
    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
     
    from Tkinter import *
    import threading 
    import time
     
    continuer=1;
     
    class MonThread(threading.Thread):
    	def __init__(self):
    		threading.Thread.__init__(self)
    		self._etat = False
    		self._pause = False
     
    	def run(self):
    		self._etat = True
    		while self._etat:
    			if self._pause:
    				time.sleep(0.1)
    				continue
    			print "abc" #action répétitive
     
    	def stop(self):
    		self._etat = False
     
    	def pause(self):
    		self._pause = True
     
    	def continu(self):
    		self._pause = False
     
     
     
    a = MonThread()
    a.start()
    a.pause()
    fenetre = Tk()
    bouton_lancer = Button(fenetre, text="Lancer", command=a.continu)
    bouton_lancer.pack()
    bouton_stop = Button(fenetre, text="stop", command=a.pause)
    bouton_stop.pack()
    fenetre.mainloop()

  7. #7
    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 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Léo-Nils Voir le message
    Pour ceux que la solution pourrait intéresser, voici un code qui lorsque l'on clique sur le premier bouton, lance une action répétitive, et l’arrête l'orque l'on clique sur le bouton juste en dessous.
    Un bibliothèque comme tkinter apporte un multitâche coopératif: pas besoin de threads pour réaliser des activités répétitives:
    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
    import tkinter as tk
     
    timer = None
     
    def do_pause():
        global timer
     
        if timer:
            root.after_cancel(timer)
            timer = None
     
    def do_start(delay=100):
        global timer
     
        print ('abc')
        timer = root.after(delay, do_start)
     
    root = tk.Tk()
    tk.Button(root, text='start', command=do_start).pack()
    tk.Button(root, text='pause', command=do_pause).pack()
    tk.mainloop()
    mais bon, il faut prendre le temps d'apprendre à utiliser Python, tkinter,...

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

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

Discussions similaires

  1. Problème pour arréter une boucle avec un bouton
    Par Zizook dans le forum Tkinter
    Réponses: 17
    Dernier message: 17/03/2014, 13h26
  2. programmer un bouton pour arreter une boucle
    Par yassine.khe dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2009, 10h59
  3. Réponses: 2
    Dernier message: 09/02/2007, 18h47
  4. Boutons pour lancer/arrêter une animation Flash ?
    Par -=ET=- dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 01/05/2006, 02h54
  5. Bouton pour arrêter la musique
    Par mpat dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/06/2005, 09h52

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