2017-10-12 128 views
0

我是新来的Python,我试图编写一个程序,基于接收到的UDP消息在接口上显示图像。 虽然我可以分开做两件事,但我无法让它一起工作。 原因很简单,UDP侦听器的while循环不允许tkinter的主循环发生,我无法找到使其工作的方式。 我也不确定代码中的图像“删除”这一面。基于UDP消息显示图片

你能帮我找到解决办法吗?

不确定这是否重要,但这是在Raspberry Pi上运行。

下面是代码:从Tkinter的进口* 进口插座

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() 

谢谢你这么多 。 文斯。

回答

0

如果你想同时发生2件事情,你需要运行2个线程。蟒蛇threading模块使这非常容易。

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() 

(没有经过测试)

+0

非常感谢您的解决方案。它现在用线程工作得很好。我只是编辑你的解决方案,添加两个缺少的导入(我的糟糕的是,他们没有出现在我的原始邮件的代码部分。 – MadeByVince

+0

只是最后一件事...它的“canvas.delete”一边不起作用。添加图片,但无法删除它。任何想法?谢谢 – MadeByVince