Python Tkinter多处理can';泡菜
我正在尝试用Python和Tkinter编写一个简单的messenger应用程序。我正在听一个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线
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()
,它解决了我的问题。它是如何做的,做了什么?这不是答案,请告诉我更多