2015-08-14 37 views
1

我想用Python和Tkinter編寫一個簡單的消息應用程序。我正在收聽UDPSock以接收輸入。但是,因爲Tkinter的mainloop()阻塞了線程,所以我無法僅通過一個線程接收輸入。我試圖將Tkinter GUI的引用發送到Process,該引用循環並偵聽輸入,但我得到一個Can't pickle 'tkapp' object錯誤。由於輸入是連續的,Tkinter線程除了運行mainloop來處理GUI之外不能執行任何操作,所以我不能將接收到的輸入放到GUI中。即使我使用PipeTkinter線程運行mainloop等有無處我可以把Tkinter多處理不能泡菜

while True: 
    data = pipe_conn.recv() 
    # do something with data 

或任何東西。

任何幫助將不勝感激!

我的代碼:

-- imports -- 

class MessageApp(): 
    def __init__(self, root, host, conn, port=13000): 
     # Setup GUI 
     self.send_sock = socket(AF_INET, SOCK_DGRAM) 
     p = Process(target=self.recv, args=(conn,)) 

    def recv(self, conn): 
     buff = 1024 
     print('recvin') 
     while True: 
      (data, addr) = conn.recvfrom(buff) 
      self.add_msg(addr + ": " + data) 

    def start(self): 
     self.root.mainloop() 

    def add_msg(self, text): 
     self.msgs.config(state=NORMAL) 
     self.msgs.insert(INSERT, text + "\n") 
     self.msgs.config(state=DISABLED) 

    def send(self): 
     self.add_msg(self.inpt.get()) 
     self.send_sock.sendto(self.inpt.get(), self.send_addr) 
     self.inpt.delete(0, 'end') 

# ----------WHERE CAN I PUT THIS------------ 
def msg_listen(messenger, conn, port=13000): 
    buff = 1024 
    recv_sock = socket(AF_INET, SOCK_DGRAM) 
    recv_sock.bind(('', port)) 
    while True: 
     (data, addr) = recv_sock.recvfrom(buff) 
     conn.send() 
    recv_sock.close() 
# ------------------------------------------ 

def msgr_init(conn): 
    root = Tk() 
    messenger = MessageApp(root, ip, conn) 
    messenger.start() 

if __name__ == "__main__":  
    root = Tk(
    par_conn, chd_conn = Pipe(True) 
    msg_proc = Process(target=msgr_init, args=(chd_conn,)) 
    msg_proc.start() 
    msg_listen(messenger, par_conn) 

回答

0

我閱讀文檔後發現Tkinter.after(),它解決了我的問題。

+1

它是怎麼做的?這不是一個答案,請告訴更多 – Wlliam