python - Tkinter多处理不能泡菜

标签 python multithreading python-2.7 tkinter

我正在尝试使用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/

相关文章:

c# - 异步添加内容(线程+ajax)

python - 使用整数值的 numpy 数组时处理字符串值

python - 如何获取包含管道的 Python 子进程命令的输出?

python - 如何修复旨在解决行列式的函数?

并发加载和存储

android - InstrumentationTestCase2 中 AlertDialog 上的 peformClick() 不起作用

python - 通过 Tensorflow 消费大数据

python - 在 Django 1.3.1 中使 View 缓存过期

python-2.7 - 等待 Jenkins 构建完成

python - Pandas 将 1 列值与另一个数据框列进行比较,找到匹配的行