1
我想用Python和Tkinter編寫一個簡單的消息應用程序。我正在收聽UDPSock
以接收輸入。但是,因爲Tkinter的mainloop()
阻塞了線程,所以我無法僅通過一個線程接收輸入。我試圖將Tkinter
GUI的引用發送到Process
,該引用循環並偵聽輸入,但我得到一個Can't pickle 'tkapp' object
錯誤。由於輸入是連續的,Tkinter
線程除了運行mainloop
來處理GUI之外不能執行任何操作,所以我不能將接收到的輸入放到GUI中。即使我使用Pipe
的Tkinter
線程運行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)
它是怎麼做的?這不是一個答案,請告訴更多 – Wlliam