2017-10-12 90 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