【发布时间】:2015-11-07 05:08:24
【问题描述】:
我正在尝试使用 Python 和 Tkinter 编写一个简单的信使应用程序。我正在收听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)
【问题讨论】:
标签: python multithreading python-2.7 tkinter