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 :

Thread.tkinter et variable globale


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2021
    Messages : 13
    Par défaut Thread.tkinter et variable globale
    Bonjour, j'ai un thread qui gère une communication client-serveur et une interface graphique tkinter qui permet de modifier la valeur affectée à la variable globale à envoyer au serveur ( par clic sur l'un des boutons de l'interface). Mais lorsque je clique sur l'un des boutons le thread n'envoie pas le message au serveur. Quelqu'un pour m'aider s'il vous plaît. Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2021
    Messages : 13
    Par défaut
    Bonjour, voilà le bout de code géré par le thread. Mais ça ne marche pas à cause de la variable globale msg. J'attend votre aide s'il vous plaît. Merci d'avance.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    msg = None   
     
    def demarrer():
        global msg
        msg = str(1)
     
    def arreter():
        global msg
        msg = str(4)
     
    def devier_a_gauche():
        global msg
        msg = str(2)
     
    def devier_a_droite():
        global msg
        msg = str(3)
     
    HOST = sys.argv[-1] if len(sys.argv) > 1 else '192.168.43.199'
    PORT = utils.PORT
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((HOST, PORT))
    print('\nConnected to {}:{}'.format(HOST, PORT))
    print("Type message, enter to send. 'q' to quit")
     
    class ThreadCommunication(threading.Thread):
        """objet thread gérant la communication"""
        def __init__(self, sock):
            threading.Thread.__init__(self)
            self.connexion = sock           # réf. du socket de connexion
        def run(self):
            global msg
            if(msg):
                utils.send_msg(sock, msg)
                print(msg)
            #print(msg)
            msg = None
            msgFromArduino = utils.recv_msg(sock)
            msgFromArduino = msgFromArduino.split(':')[1].split(';')
            print(msgFromArduino)
            if (not(len(msgFromArduino) < 6)):
                data1 = msgFromArduino[0]
                data2 = msgFromArduino[1]
                data3 = msgFromArduino[2]
                data4 = msgFromArduino[3]
                data5 = msgFromArduino[4]
                start_time = time.time()
                secondes = time.time() - start_time
                Distance_ultrason.append(data1)
                vitesse_droite.append(data2)
                vitesse_gauche.append(data3)
                Latitude.append(data4)
                Longitude.append(data5)
                temps.append(round(secondes, 2))
                now = datetime.datetime.now()
                c = open('fichierrobot_car_' +  '_' + str(now.strftime("%Y-%m-%d-%H-%M")) + '.csv', "w")
                c = csv.writer(c, delimiter="\t")
                c.writerow (("Distance_ultrason","vitesse_droite","vitesse_gauche","Latitude","Longitude","temps"))
                fin1, fin2 = len(Distance_ultrason), len(vitesse_droite)
                if fin1 == fin2: 
                    for i in range (fin1):
                        c.writerow((Distance_ultrason[i],vitesse_droite[i],vitesse_gauche[i],Latitude[i],Longitude[i],temps[i]))
                        return vitesse_droite, vitesse_gauche, temps
    thrd = ThreadCommunication(sock)
    thrd.start()

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par yazchapi Voir le message
    Bonjour, voilà le bout de code géré par le thread. Mais ça ne marche pas à cause de la variable globale msg. J'attend votre aide s'il vous plaît. Merci d'avance.
    Le bout de code est un programme qui lance un thread qui ne fait qu'une seule opération sans même attendre que la variable globale ait été modifiée.
    A la base vous ne savez pas trop programmer çà.

    Commencer par un code plus simple: un Bouton tkinter qui lorsqu'on clique dessus affiche un message.

    Puis vous ouvrez la documentation des threads pour apprendre à vous en servir. Vous devriez trouver qu'écrire dans une Queue serait peut être un moyen pour communiquer des données à un thread. Donc à la place d'afficher un message avec "print", vous allez le pousser dans une Queue et de l'autre côté le thread qui attendait qu'il y ait quelque chose à faire se réveille pour lire le message dans la Queue et dans un premier temps seulement l'afficher sera un bon début.

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

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2021
    Messages : 13
    Par défaut
    J'ai commencé par un simple code: un thread qui remplit un label avec le résultat d'un calcul à chaque clic d'un bouton d'une interface tkinter et ça marche correctement. Merci.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2021
    Messages : 13
    Par défaut
    Bonjour
    Voilà un code de test que j'ai écrit en suivant ce que vous avez:

    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
     from threading import Thread
    from queue import Queue
    from time import sleep
     
    class Producer:
    	def __init__(self):
    		self.q = Queue()
     
    	def produce(self):
    		i = input()
    		self.q.put(i)
    		if (not(self.q.put(i) == None)):
    			print('Item produced', self.q.put(i))
    		else:
    			self.q.put_nowait(i)
    		sleep(1)
     
    class Consumer:
    	def __init__(self, prod):
    		self.prod = prod
     
    	def consume(self):
    		msg = self.prod.q.get()
    		if (not(msg == None)):
    			print('Item receved', msg)
    		else:
    			self.prod.q.get_nowait()
    p = Producer()
    c = Consumer(p)
    t1 = Thread(target=p.produce)
    t2 = Thread(target=c.consume)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

    Et le bout de code mis à jour (J'ai pas testé comme je ne suis pas au laboratoire (Le but du projet est de commander un robot-car à distance)).

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     msg = None	
     
    def demarrer():
    	global msg
    	msg = str(1)
     
    def arreter():
    	global msg
    	msg = str(4)
     
    def devier_a_gauche():
    	global msg
    	msg = str(2)
     
    def devier_a_droite():
    	global msg
    	msg = str(3)
     
    HOST = sys.argv[-1] if len(sys.argv) > 1 else '192.168.43.199'
    PORT = utils.PORT
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((HOST, PORT))
    print('\nConnected to {}:{}'.format(HOST, PORT))
    print("Type message, enter to send. 'q' to quit")
     
    class Attente:
    	def __init__(self):
    		self.q = Queue()
    	def produce(self):
    		global msg
    		self.q.put(msg)
    		if (not(self.q.put(msg) == None)):
    			print('msg in queue', self.q.put(msg))
    		else:
    			self.q.put_nowait(msg)
    		sleep(1)
     
    class ThreadCommunication(threading.Thread):
    	"""objet thread gérant la communication"""
    	def __init__(self, sock, prod):
    		threading.Thread.__init__(self)
    		self.connexion = sock           # réf. du socket de connexion
    		self.prod = prod
    	def communication(self):
    		msg = self.prod.q.get()
    		if (not(msg == None)):
    			print('msg receved', msg)
    		else:
    			self.prod.q.get_nowait()
    		utils.send_msg(sock, msg)
    		msgFromArduino = utils.recv_msg(sock)
    		msgFromArduino = msgFromArduino.split(':')[1].split(';')
    		print(msgFromArduino)
    		if (not(len(msgFromArduino) < 6)):
    			data1 = msgFromArduino[0]
    			data2 = msgFromArduino[1]
    			data3 = msgFromArduino[2]
    			data4 = msgFromArduino[3]
    			data5 = msgFromArduino[4]
    			start_time = time.time()
    			secondes = time.time() - start_time
    			Distance_ultrason.append(data1)
    			vitesse_droite.append(data2)
    			vitesse_gauche.append(data3)
    			Latitude.append(data4)
    			Longitude.append(data5)
    			temps.append(round(secondes, 2))
    			now = datetime.datetime.now()
    			c = open('fichierrobot_car_' +  '_' + str(now.strftime("%Y-%m-%d-%H-%M")) + '.csv', "w")
    			c = csv.writer(c, delimiter="\t")
    			c.writerow (("Distance_ultrason","vitesse_droite","vitesse_gauche","Latitude","Longitude","temps"))
    			fin1, fin2 = len(Distance_ultrason), len(vitesse_droite)
    			if fin1 == fin2:  
    				for i in range (fin1):
    					c.writerow((Distance_ultrason[i],vitesse_droite[i],vitesse_gauche[i],Latitude[i],Longitude[i],temps[i]))
    					return vitesse_droite, vitesse_gauche, temps 
    p = Attente()
    thrd = ThreadCommunication(sock, p)
    t1 = Thread(target=p.produce)
    t2 = Thread(target=thrd.communication)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

    J'attends vos commentaires pour améliorer et aller faire le test. Merci de vous patienter pour des constats choquants. Merci.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par yazchapi Voir le message
    J'attends vos commentaires pour améliorer et aller faire le test. Merci de vous patienter pour des constats choquants.
    Si vous pensez que le code que vous avez écrit a des chances de fonctionner, il faut le tester et (vous) poser des questions en fonction de comment il réagit (ce qu'on ne peut pas faire pour vous puisqu'on n'a pas le robot qui est commandé par le code).

    Pour le reste, si vous aviez suivi les conseils que je vous ai donné (écrire un petit code pour voir comment articuler tkinter et thread via une Queue), vous auriez constaté par vous même que le thread qui produit des informations est le côté tkinter: pas besoin d'un thread Producer.

    De plus, ce code là n'a pas besoin de robot pour être testé (et constater qu'il fonctionne ou pas).

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

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par yazchapi Voir le message
    Vous avez bien dit qu'on peut le tester sans avoir le robot
    Je parlais justedu code qui affiche un Button qui lorsqu'on clique dessus pousse une information dans une Queue avec de l'autre côté un thread qui récupère ce qu'il y a dans la Queue pour l'afficher (avec print).

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

Discussions similaires

  1. threads et variables globales
    Par deb75 dans le forum C
    Réponses: 3
    Dernier message: 18/12/2007, 19h44
  2. [MT] thread et variable globale
    Par r0d dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 15/08/2007, 02h18
  3. Réponses: 4
    Dernier message: 04/02/2007, 19h39
  4. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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