我正在尝试使用Python和Tkinter编写一个简单的Messenger应用程序。我正在听UDPSock
接收输入。但是,由于Tkinter的mainloop()
阻塞了线程,所以我无法仅使用一个线程来接收输入。我试图将对Tkinter
GUI的引用发送到循环并监听输入的Process
,但出现了Can't pickle 'tkapp' object
错误。由于输入是连续的,并且Tkinter
线程无法执行任何其他操作,只能运行mainloop
来处理GUI,因此无法将收到的输入放到GUI上。即使我使用Pipe
,但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()
,它解决了我的问题。
关于python - Tkinter多处理不能泡菜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32001666/