2017-10-12 5 views
0

Je suis nouveau sur Python et j'essaye d'écrire un programme qui affiche une image sur une interface basée sur un message UDP reçu. Alors que je peux faire les deux choses séparément, je ne peux pas le faire fonctionner ensemble. La raison est simple, la boucle while de l'écouteur UDP n'autorise pas la boucle principale de tkinter et je n'arrive pas à trouver un moyen de la faire fonctionner. Je ne suis pas sûr de l'image "supprimer" le côté du code.Afficher l'image basée sur le message UDP

Pouvez-vous m'aider à trouver la solution?

Vous ne savez pas si c'est important, mais cela fonctionne sur un Raspberry Pi.

Voici le code: d'importation tkinter * socket d'importation

root = Tk() 
canvas = Canvas(root) 
canvas.pack() 

UDP_PORT = 11000 
UDP_IP = "" 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind((UDP_IP, UDP_PORT)) 

photo1 = PhotoImage(file="test.gif") 
photo2 = PhotoImage(file="ant.gif") 

canvas.create_image(25, 25, image=photo1) 

while True: 
    data, addr = sock.recvfrom(1024) 
    if data.decode() == "on": 
     canvas.create_image(100, 125, image=photo2) 
    elif data.decode() == "off": 
     canvas.delete(photo2) 

root.mainloop() 

Merci beaucoup. Vince.

Répondre

0

Si vous voulez que 2 choses se produisent en même temps, vous devez exécuter 2 threads. Le module python threading rend cela très facile.

from threading import Thread 

root = Tk() 
canvas = Canvas(root) 
canvas.pack() 

UDP_PORT = 11000 
UDP_IP = "" 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind((UDP_IP, UDP_PORT)) 

photo1 = PhotoImage(file="test.gif") 
photo2 = PhotoImage(file="ant.gif") 

canvas.create_image(25, 25, image=photo1) 

def listen_for_udp(): 
    while True: 
     data, addr = sock.recvfrom(1024) 
     if data.decode() == "on": 
      canvas.create_image(100, 125, image=photo2) 
     elif data.decode() == "off": 
      canvas.delete(photo2) 

t = Thread(target=listen_for_udp) 
t.daemon = True 
t.start() 

root.mainloop() 

(totalement non testé)

+0

Merci beaucoup pour la solution. Cela fonctionne très bien maintenant avec des threads. Je viens de modifier votre solution pour ajouter les deux Imports manquants (mon mauvais, ils étaient hors de la section de code sur mon email original.) – MadeByVince

+0

Juste une dernière chose ... Le côté "canvas.delete" ne fonctionne pas. ajouter l'image mais ne peut pas l'enlever. Une idée? Merci – MadeByVince