Python Tkinter多处理can';泡菜

Python Tkinter多处理can';泡菜,python,multithreading,python-2.7,tkinter,Python,Multithreading,Python 2.7,Tkinter,我正在尝试用Python和Tkinter编写一个简单的messenger应用程序。我正在听一个UDPSock来接收输入。但是,由于Tkinter的mainloop()阻塞了该线程,因此我无法仅使用一个线程接收输入。我试图将对TkinterGUI的引用发送到循环并侦听输入的进程,但我得到一个无法pickle'tkapp'对象的错误。由于输入是连续的,Tkinter线程除了运行mainloop来处理GUI之外,无法执行任何其他操作,因此我无法将收到的输入放入GUI。即使我使用了管道,Tkinter线

我正在尝试用Python和Tkinter编写一个简单的messenger应用程序。我正在听一个
UDPSock
来接收输入。但是,由于Tkinter的
mainloop()
阻塞了该线程,因此我无法仅使用一个线程接收输入。我试图将对
Tkinter
GUI的引用发送到循环并侦听输入的
进程,但我得到一个
无法pickle'tkapp'对象的错误。由于输入是连续的,
Tkinter
线程除了运行
mainloop
来处理GUI之外,无法执行任何其他操作,因此我无法将收到的输入放入GUI。即使我使用了
管道
Tkinter
线程正在运行
mainloop
,因此没有地方可以放置

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)

在阅读文档后,我发现了
Tkinter.after()
,它解决了我的问题。

它是如何做的,做了什么?这不是答案,请告诉我更多