【问题标题】:Tkinter multiprocessing can't pickleTkinter 多处理不能腌制
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 怎么样,它做了什么?这不是答案,请告诉更多
    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2018-04-22
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多